原贴:http://blog.csdn.net/cax1165/article/details/53052917
从1 − N中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数
最大可能是多少。
对于n的阶乘质因数分解后
如果一个素数次数是奇数那么不选这个素数
否则选这个素数
这样就能保证最大并且不会出现一个数的一部分选一部分不选的情况
因为不选的一定是素数
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;
const int P=100000007;
const int N=5000005;
int prime[N],num;
int vst[N];
inline void Pre(int n){
for (int i=2;i<=n;i++){
if (!vst[i]) prime[++num]=i;
for (int j=1;j<=num && (ll)i*prime[j]<=n;j++){
vst[prime[j]*i]=1;
if (i%prime[j]==0)
break;
}
}
}
int n;
inline ll calc(int x){
ll tem=x,q=0;
while (n/tem) q+=n/tem,tem*=x;
return q;
}
int main(){
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
scanf("%d",&n); Pre(n);
ll ret=1;
for (int i=2;i<=n;i++)
if (!vst[i]){
if (~calc(i)&1)
(ret*=i)%=P;
}else
(ret*=i)%=P;
printf("%lld",ret);
return 0;
}