问题链接
http://codeforces.com/contest/615/problem/D 解决方案的链接是 http://codeforces.com/contest/615/submission/15260890
在下面的代码中,我无法理解为什么从mod中减去1 其中mod = 1000000007
ll d = 1;
ll ans = 1;
for (auto x : cnt) {
ll cnt = x.se;
ll p = x.fi;
ll fp = binPow(p, (cnt + 1) * cnt / 2, MOD);
ans = binPow(ans, (cnt + 1), MOD) * binPow(fp, d, MOD) % MOD;
d = d * (x.se + 1) % (MOD - 1);//why ??
}
答案 0 :(得分:2)
除了代码没有太大意义这样的事实之外,还有费尔马的小定理:
每当MOD
是素数时,10^9+7
就是,可以将指数减少为
a ^ (MOD-1) == 1 mod MOD.
这意味着
a^b == a ^ (b mod (MOD-1)) mod MOD.
对于对其任务有效的代码,请考虑n=m*p^e
其中m
由小于p
的素数组成。
然后,f
的每个因素m
都有1*f, p*f, ^2*f,...,p^e*f
的因子n
。因此n
所有因素的产品都是
p^(0+1+2+...+e) * f^(e+1) = p^( e*(e+1)/2 ) * f^(e+1)
f
的所有因素m
。将因子数量d
和因子m
的乘积作为ans
得出组合公式
ans = ans^( e+1 ) * p^( d*e*(e+1)/2 )
d = d*(e+1)
现在可以递归地应用于素数因子及其多重性列表。