问题描述
一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数(Pefect Sqaure),也称平方数。
小A认为所有的平方数都是很perfect的~
于是他给了小B一个任务:用任意个不大于n的不同的正整数相乘得到完全平方数,并且小A希望这个平方数越大越好。
请你帮助小B告诉小A满足题意的最大的完全平方数。
输入
输入文件名为number.in
输入仅 1行,一个数n。
输出
输出文件名为number.out
输出仅1行,一个数表示答案。由于答案可以很大,所以请输出答案对100000007(注意!10^8+7)取模后的结果。
输入输出样例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。
题解
这题可以简化为在[1,n]中取任意个数,组成最大的形如ans=a^(2*Na)*b^(2*Nb)*……的数即可
很容易发现大于n/2+1的数和质数都不能选择作为底数
而在剩下的数中我们可以枚举i,在[1,n]数字中将每个数字分解为i^xi*φ的形式,记录下Σxi
易证Σxi只有为偶数时才能组成完全平方,取i^(Σxi),
当Σxi为奇数时我们取i^(Σxi-1)
所以 答案就为Σ(i^(Σxi-1))
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cmath> 5 #include<cstring> 6 #include<algorithm> 7 using namespace std; 8 9 long long n,ans; 10 bool zs[50000005]; 11 12 long long query(long long); 13 long long work(long long,long long); 14 int main() 15 { 16 long long i,j,sum; 17 scanf("%I64d",&n); 18 for(i=2;i<=n/2+1;i++) 19 if(!zs[i]) for(j=2;i*j<=n;i++) zs[i*j]=true; 20 21 ans=1; 22 for(i=2;i<=n/2+1;i++) 23 { 24 if(!zs[i]) 25 { 26 cout<<"*"<<i<<endl; 27 j=0; 28 sum=query(i); cout<<sum<<endl; 29 if(sum%2!=0) sum--; 30 if(sum!=0) j=work(i,sum); cout<<j<<endl; 31 if(j!=0) ans=(ans*j)%100000007; 32 } 33 } 34 printf("%I64d",ans); 35 return 0; 36 37 } 38 39 long long query(long long v) 40 { 41 long long ans,x; 42 ans=0; 43 x=n; 44 for(;x>0;x/=v,ans+=x); 45 return ans; 46 } 47 48 long long work(long long a,long long b) 49 { 50 long long ans=1,x=a%100000007; 51 for(;b>0;b/=2,x=(x*x)%100000007) if(b%2!=0) ans=(ans*x)%100000007; 52 return ans; 53 }
时间: 2024-11-05 10:52:59