比赛 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;
}