平方数
Description
一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数(perfect square),也称平方数。小A认为所有的平方数都是很perfect的~
于是他给了小B一个任务:用任意个不大于n的不同的正整数相乘得到完全平方数,并且小A希望这个平方数越大越好。请你帮助小B告诉小A满足题意的最大的完全平方数。
Input
输入文件名为number.in。
输入仅一行,一个正整数n。
Output
输出文件名为number.out。
输出仅一行,一个数表示答案。
由于答案可以很大, 所以请输出答案对108+7取模后的结果。
Sample Input
【样例1输入】
7
【样例1输出】
144
【样例1说明】144=234*6=12^2
Sample Output
【样例2输入】
9
【样例2输出】
5184
【样例2说明】5184=34689=72^2
思路
- 找找规律,发现题目所求问题是n!中各质数偶数次方的乘积
- 要加逆元
代码
#include <iostream>
#include <cstdio>
using namespace std;
const int mod=1e8+7;
const int maxn=5000005;
int n,keep[348888],cnt;
long long ans=1;
bool vis[maxn];
void sieve(int x)
{
for(int i=2;i<=x;++i) {
ans=ans*i%mod;
if(!vis[i]) keep[++cnt]=i;
for(int j=1;j<=cnt&&i*keep[j]<=x;++j) {
vis[i*keep[j]]=1;
if(i%keep[j]==0) break;
}
}
}
long long qpow(long long x,long long a)
{
long long ans=1;
while(a)
{
if(a&1) ans=ans*x%mod;
x=x*x%mod;
a>>=1;
}
return ans;
}
int main()
{
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
scanf("%d",&n);
sieve(n);
for(int i=1;i<=cnt;++i)
{
long long temp=n,num=0;
while(temp) temp/=keep[i],num+=temp;
if(num&1) ans=ans*qpow(keep[i],mod-2)%mod;
}
cout<<ans<<'
';
return 0;
}