• 【lojg152】 乘法逆元 2(数学)


    题面

    传送门

    题解

    orz Wa自动机

    这是一个可以(O(n))求出(n)个数逆元的方案

    先把所有的数做一个前缀积,记为(s_i)

    然后我们用快速幂求出(s_n)的逆元,记为(sv_n)

    因为(sv_n)(a_1)(a_n)的逆元,我们把它乘上(a_n),就得到了(sv_{n-1})

    同理可得(sv_{1,...,n-2})

    那么(a_i)的逆元就可以用(sv_i imes s_{i-1})来表示了

    //minamoto
    #include<bits/stdc++.h>
    #define R register
    #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
    #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
    #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
    using namespace std;
    char buf[1<<21],*p1=buf,*p2=buf;
    inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
    int read(){
        R int res,f=1;R char ch;
        while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
        for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
        return res*f;
    }
    const int N=5e6+5,P=1e9+7;
    inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
    inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
    inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
    int ksm(R int x,R int y){
    	R int res=1;
    	for(;y;y>>=1,x=mul(x,x))(y&1)?res=mul(res,x):0;
    	return res;
    }
    int a[N],s[N],sv[N],n,res;
    int main(){
    //	freopen("testdata.in","r",stdin);
    	n=read(),s[0]=1;
    	fp(i,1,n)a[i]=read(),s[i]=mul(s[i-1],a[i]);
    	sv[n]=ksm(s[n],P-2);
    	fd(i,n,2)sv[i-1]=mul(sv[i],a[i]);
    	fp(i,1,n)res=(1ll*res*998244353+1ll*sv[i]*s[i-1])%P;
    	printf("%d
    ",res);
    	return 0;
    }
    
  • 相关阅读:
    什么是软件质量?
    软件生存周期及其模型是什么?
    给你一个网站,你如何测试?
    jquery中$.get()提交和$.post()提交有区别吗?
    JQuery有几种选择器?
    ajax和layui总结
    md5加密
    Collection接口相关介绍
    JS 中document.URL 和 windows.location.href 的区别
    window.location.href的用法(动态输出跳转)
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/10583010.html
Copyright © 2020-2023  润新知