完全平方数(简单的数论)
题目描述
一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数(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;
}
浙公网安备 33010602011771号