【NOIP模拟赛】【数学】完全平方数

问题描述

一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数(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 }
View Code

 

 



 

原文地址:https://www.cnblogs.com/yljiang/p/5492464.html