完全平方数(简单的数论)
题目描述
一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数(Pefect Sqaure),也称平方数。
小A认为所有的平方数都是很perfect的~
于是他给了小B一个任务:用任意个不大于n的不同的正整数相乘得到完全平方数,并且小A希望这个平方数越大越好。
请你帮助小B告诉小A满足题意的最大的完全平方数。
输入
输入文件名为number.in
输入仅 1行,一个数n。
输出
输出文件名为number.out
输出仅1行,一个数表示答案。由于答案可以很大,所以请输出答案对100000007取模后的结果。
样例输入
【输入输出样例1】
number.in
7
number.out
144
【输入输出样例解释1】
144=2×3×4×6,是12的完全平方。
样例输出
【输入输出样例2】
number.in
9
number.out
5184
【输入输出样例解释2】
5184=3×4×6×8×9,是72的完全平方。
提示
【数据范围】
对于20%的数据,0<n≤100;
对于50%的数据,0<n≤5,000;
对于70%的数据,0<n≤100,000;
对于100%的数据,0<n≤5,000,000。
solution:
一个非常显然的贪心:把所有数全部乘起来,然后对于奇数次方的质因数次数减一,这个质因数一定<=n,所以一定可以做到。
有了这个想法,题目就很简单了。先一个线性筛法,然后枚举每一个质因子的个数,统计答案就好了。
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<cstdlib> using namespace std; int n,prime_num,sqrtn; bool is_prime[5000005]; long long ans,prime[1000000]; long long ksm(long long x,int y){ if(y==0) return 1; long long tmp=ksm(x,y>>1); if(y&1) return tmp*tmp%100000007*x%100000007; else return tmp*tmp%100000007; } int main(){ scanf("%d",&n); sqrtn=int(sqrt(n)); for(int i=2;i<=n;i++) is_prime[i]=true; for(int i=2;i<=n;i++) if(is_prime[i]){ prime[++prime_num]=(long long)i; if(i<=sqrtn) for(int j=i*i;j<=n;j+=i) is_prime[j]=false; } ans=1; for(int i=1;i<=prime_num;i++){ int times=0,j=n; while(j>=prime[i]){ times+=j/prime[i]; j/=prime[i]; } if(times&1) times--; ans=ans*ksm(prime[i],times)%100000007; } printf("%lld\n",ans); return 0; }