据说这题非常卡时间
题目:用不大于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 <math.h>
#define N 10000001
#define M 3000000
#define MOD 1000000007
__int64 fac[N];
int pri[N];
int cnt;
void p()
{
fac[0] = 1;
int i,j;
for(i = 1; i < N; ++i)
fac[i] =
这道题目要求在不超过n的数中构造最大的完全平方数,关键在于处理素因子个数。由于完全平方数的素因子个数必须为偶数,原计划通过计算N!的素因子个数,但因数值过大导致快速幂运算超时。通过应用费马小定理,可以找到正确的方法:计算a=c/b时,a%mod可以通过c%mod和b%mod的关系求得,即A=A*B^(mod-2),从而避免了直接除法导致的超时问题。
订阅专栏 解锁全文
4828

被折叠的 条评论
为什么被折叠?



