比赛 |
noip |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
__完全平方数 |
最终得分 |
100 |
用户昵称 |
_Itachi |
运行时间 |
0.480 s |
代码语言 |
C++ |
内存使用 |
5.90 MiB |
提交时间 |
2016-11-04 19:07:07 |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=5000005,INF=100000007;
int n,prime[maxn>>2],cnt=0;bool check[maxn];
void Rabit_pre(){
int i,j;
for(i=2;i<=n;i++){
if(!check[i])prime[++cnt]=i;
for(j=1;j<=cnt;j++){
if(i*prime[j]>n)break;
check[i*prime[j]]=true;
if(i%prime[j]==0)break;
}
}
//for(i=1;i<=cnt;i++)printf("%d,",prime[i]);
}
int Rabit_get(int k,int p){
int res=0,x=1;
while(true){
if(x>k/p)break;
x*=p;
res+=k/x;
}
return res;
}
int Rabit_pow(int x,int k){
int res=1;
while(k){
if(k&1)res=(res*1ll*x)%INF;
x=(x*1ll*x)%INF,k>>=1;
}
return res;
}
int Rabit_ans(){
int i,tmp,ans=1;
for(i=1;i<=cnt;i++){
tmp=Rabit_get(n,prime[i]);
tmp>>=1,tmp<<=1;
ans=(ans*1ll*Rabit_pow(prime[i],tmp))%INF;
}
return ans;
}
void Rabit_main(){
scanf("%d",&n);
Rabit_pre();
printf("%d\n",Rabit_ans());
}
int main(){
#define _Rabit _RABIT
#ifdef _Rabit
freopen("xnumber.in","r",stdin);
freopen("xnumber.out","w",stdout);
#endif
Rabit_main();
#ifndef _Rabit
getchar(),getchar();
#endif
fclose(stdin);fclose(stdout);
return 0;
}