看了题目还好,再看看数据范围,没想法,果断借鉴前辈的思想。
先打素数表,并且将小于等于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;
}