【问题标题】:why 1 is subtracted from mod where mod =1000000007 in calculation为什么在计算中从 mod = 1000000007 的 mod 中减去 1
【发布时间】:2017-04-12 10:31:39
【问题描述】:

问题链接

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 ??
}

【问题讨论】:

  • 其他人也不太可能知道,因为您还没有指出这段代码应该做什么。
  • 现在,我添加解决方案和问题的链接
  • 欢迎来到 Stack Overflow!您可以阅读如何How to Ask 一个问题并创建一个minimal reproducible example。这让我们更容易为您提供帮助。

标签: math numbers primes number-theory mod


【解决方案1】:

除了代码断章取义并没有多大意义之外,还有一个费马小定理

只要MOD 是质数,就像10^9+7 一样,可以将指数减少(MOD-1) 的倍数,就像任何a 不是MOD 的倍数一样

a ^ (MOD-1) == 1  mod MOD.

这意味着

a^b == a ^ (b mod (MOD-1))  mod MOD.

关于对其任务有效的代码,请考虑n=m*p^e,其中m 由小于p 的素数组成。

那么对于fm 中的每个因子,都有1*f, p*f, p^2*f,...,p^e*fn 的因子。 n 的所有因素的乘积因此是乘积

p^(0+1+2+...+e) * f^(e+1) = p^( e*(e+1)/2 ) * f^(e+1)

所有因素fm。将因子个数设为d,将m的因子乘积设为ans,得到组合公式

ans = ans^( e+1 ) * p^( d*e*(e+1)/2 )
d = d*(e+1)

现在可以递归地应用于素因数列表及其多重性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多