[费马小定理]hdu 4196

这道题目要求在不超过n的数中构造最大的完全平方数,关键在于处理素因子个数。由于完全平方数的素因子个数必须为偶数,原计划通过计算N!的素因子个数,但因数值过大导致快速幂运算超时。通过应用费马小定理,可以找到正确的方法:计算a=c/b时,a%mod可以通过c%mod和b%mod的关系求得,即A=A*B^(mod-2),从而避免了直接除法导致的超时问题。
摘要由CSDN通过智能技术生成

据说这题非常卡时间


题目:用不大于n内的所有数去组成一个尽可能大的完全平方数。

完全平方数,显然是所有的素因子的个数都是偶数,便取N!的所有素因子的个数,便 有了初步想法,算出N!的什么素因子个数,奇数的就舍去一个,偶数的全要,然后再全部乘起来,可是因为规模很大,即使快速幂乘也是会超时。

于是考虑把N!除掉那些奇数个因子的乘积,便是求a=c/b,由于是取模的,直接除必然不行。

考虑c%mod=(a%mod)*(b%mod);令A=a%mod; B=b%mod;C=c%mod;

则A=a%mod=(a*1)%mod=a%mod*1%mod=(a%mod)*(b^(mod-1))%mod --------因为(b^(mod-1))%mod=1,费马小定理。

=(a*b)%mod*(b^(mod-2))%mod=(c%mod)*(b%mod)^(mod-2)%mod=C*B^(mod-2)

利用这个,就可以求出c/b的结果。


#include <stdio.h>
#include <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值