hdu~4196~素数

来源:互联网 发布:照片后期调色软件 编辑:程序博客网 时间:2024/04/29 15:58

看了题目还好,再看看数据范围,没想法,果断借鉴前辈的思想。

先打素数表,并且将小于等于i的合数之积存于sum[i],计算时统计素数幂数,如果为偶数个将没乘进去的素数加入,否则就不用加入此素数。


ACcode:

#include<stdio.h>#include<iostream>#define LL long long using namespace std;const int size=10000000;const int MOD=1000000007;LL sum[size+10],res;int isprime[size+10],prime[700000];int top=0,n,num,i,j,k;void primetable(){     sum[1]=1;     for (i=2;i<=size;i++)     {         sum[i]=sum[i-1];         if (!isprime[i])         {            prime[top++]=i;            if (i<=4000)            for (j=i*i;j<=size;j+=i)                isprime[j]=1;         }         else sum[i]=(sum[i]*i)%MOD;     }}int main(){    primetable();    while (scanf("%d",&n)&&n)    {          for (res=sum[n],i=0;i<top&&prime[i]<=n/2;i++)          {              k=n,num=0;              while (k>=prime[i]) k/=prime[i],num+=k;              if (num%2==0) res=(res*prime[i])%MOD;          }                printf("%I64d\n",res);    }    return 0;   }



原创粉丝点击