数論BZOJ3601人

人々の数に

所与\(N- \)素因数分解\(N = \ prod_ {私は= 1} ^ wp_i ^ {AI} \) 全て未満を見つける(N- \)\\(N- \)互いに素の正整数(\ M)\乗とダイ\(9 + 10 ^ 7 \)の値。前記\(^ P私は\)以上の素数ではありません(10 ^ 9 \)\

\(^ I≤109、≤千ワット、M≤100 \)

問題の解決策

1

2

poly operator*(CO poly&a,CO poly&b){
    int n=a.size()-1,m=b.size()-1;
    poly ans(n+m+1);
    for(int i=0;i<=n;++i)for(int j=0;j<=m;++j)
        ans[i+j]=add(ans[i+j],mul(a[i],b[j]));
    return ans;
}
poly operator/(poly a,CO poly&b){
    int n=a.size()-1,m=b.size()-1;
    poly ans(n-m+1);
    int inv=fpow(b[m],mod-2);
    for(int i=n;i>=m;--i){
        ans[i-m]=mul(a[i],inv);
        for(int j=i;j>=i-m;--j) a[j]=add(a[j],mod-mul(ans[i-m],b[j-(i-m)]));
    }
    return ans;
}
poly lagrange(int n,CO poly&x,CO poly&y){
    poly ans(n+1),p={1};
    for(int i=0;i<=n;++i) p=p*(poly){mod-x[i],1};
    for(int i=0;i<=n;++i){
        poly q=p/(poly){mod-x[i],1};
        int c=1;
        for(int j=0;j<=n;++j)if(j!=i) c=mul(c,add(x[i],mod-x[j]));
        c=mul(fpow(c,mod-2),y[i]);
        for(int j=0;j<=n;++j) ans[j]=add(ans[j],mul(c,q[j]));
    }
    return ans;
}

CO int N=1e3+10;
int p[N],a[N];

int main(){
    int m=read<int>();
    poly x(m+2),y(m+2);
    x[0]=0,y[0]=0;
    for(int i=1;i<=m+1;++i) x[i]=i,y[i]=add(y[i-1],fpow(i,m));
    poly f=lagrange(m+1,x,y);
    int w=read<int>();
    for(int i=1;i<=w;++i) read(p[i]),read(a[i]);
    int ans=0;
    for(int i=0;i<=m+1;++i){
        int sum=f[i];
        for(int j=1;j<=w;++j){
            int x=fpow(p[j],(int64)a[j]*i%(mod-1));
            x=add(x,mod-fpow(p[j],(m+(int64)(a[j]-1)*i)%(mod-1)));
            sum=mul(sum,x);
        }
        ans=add(ans,sum);
    }
    printf("%d\n",ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/autoint/p/12396487.html
おすすめ