平方数

平方数

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<<'\n';
	return 0;
}
posted @ 2020-11-30 17:16  wuwendongxi  阅读(1271)  评论(0)    收藏  举报