hdu2879素数筛选

来源:互联网 发布:守望先锋网络卡 编辑:程序博客网 时间:2024/06/05 12:40

#include <cstdio>    //140MS7772K#include <cstring>#include <cmath>using namespace std;const int N=5000006;    //允许的最大数组为2500*2500const int MAX=10000007;bool temp[N];int prim[700000];       // 10^7内的素数不超过700000int isprime(){          //可以返回小于MAX的素数个数    int t=0;    prim[t++]=2;    int kill=int(sqrt(1.0*MAX))+1;    //换时间    for(int i=3;i<kill;i+=2){        if(!temp[i>>1]){            for(int j=i*i;j<MAX;j+=i<<1){                temp[j>>1]=1;            }        }    }    kill=MAX>>1;    for(int i=1;i!=kill;++i){        if(!temp[i]){            prim[t++]=i<<1|1;        }    }    return t;}__int64 mypow(int n,__int64 m){    __int64 x=2,r=1;    while(n){        if(n&1) r=r*x%m;        n>>=1;        x=x*x%m;    }    return r;}int main(){    //printf("%d\n",isprime());    isprime();    int T,n;    __int64 m;    scanf("%d",&T);    while(T--){        scanf("%d%I64d",&n,&m);        int s=0,r=0;        while(prim[s]<=n&&prim[s]!=0){            r+=n/prim[s++];     //不会超int        }        printf("%I64d\n",mypow(r,m));    }    return 0;}

In the equation X^2≡X(mod N) where x∈[0,N-1], we define He[N] as the number of solutions.

And furthermore, define HeHe[N]=He[1]*……*He[N]

Now here is the problem, write a program, output HeHe[N] modulo M for a given pair N, M.

显然He[N]表示满足N|x*(x-1)且x<N的非负解的个数。不妨设N=p1^a1*p2^a2*...*pr^ar.因为N|x*(x-1)等价于K*N=x(x-1),又x与(x-1)互素,x=k1*a ,x-1=k2*b 其中a*b=N,k1*k2=K,k1*a-k2*b=1有解当且仅当a,b互素、而且得到的解k1,k2是唯一的。只要a不一样,那么对于的x就不一样。而a有2^r中选择,所以He[N]=2^r.所以对于每个n关键在于求r.又HeHe[N]=He[1]*……*He[N]。所以要求hehe[N]只需求不大于N内的所有正整数有多少个素因子即可。

                                                                                                                                           -------------上述代码拿到了当前最佳解答  ------  0.肆玖

0 0