Jzoj4900 平方数

227 篇文章 3 订阅
105 篇文章 0 订阅


 noip爆炸啦,继续写jzoj的题吧


一个数如果是另一个整数的完全平方,那么我们就称这个数为完全平方数
(perfect square),也称平方数。小A认为所有的平方数都是很perfect的~
于是他给了小B一个任务:用任意个不大于n的不同的正整数相乘得到完全平
方数,并且小A希望这个平方数越大越好。请你帮助小B告诉小A满足题意的最大的完全平方数。

由于答案可以很大, 所以请输出答案对10^8 + 7取模后的结果.

我们求出n!每个质因子的次数,若为奇数次那么就除掉一次,用逆元就好

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define M 100000007
#define LL long long
using namespace std;
bool vis[5000010];
int w[2000100],t,n;
LL S=1;
inline LL pow(LL x,LL k,LL s=1){
	for(;k;x=x*x%M,k>>=1) if(k&1) s=s*x%M;
	return s;
}
int cal(LL x){
	int cnt=0;
	for(LL k=x;k<=n;k=k*x) cnt+=n/k;
	return cnt;
}
int main(){
	freopen("number.in","r",stdin);
	freopen("number.out","w",stdout);
	scanf("%d",&n);
	for(int i=2;i<=n;++i){
		if(!vis[i]) w[++t]=i; S=S*i%M;
		for(int j=1;j<=t && i*w[j]<=n;++j){
			vis[i*w[j]]=1;
			if(i%w[j]==0) break;
		}
	}
	for(int i=1;i<=t;++i)
		if(cal(w[i])&1) S=S*pow(w[i],M-2)%M;
	printf("%d\n",S);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值