【发布时间】:2019-06-27 10:17:06
【问题描述】:
给定一个 GP 和 (1-((n-1)/n)^r) = P/Q ,当 r 很大并且输出 (P*Q^(-1) 时如何计算这个 P/Q 分数)%1000000007 其中 Q^(-1) 是 Q 模 1000000007 的模逆
我可以使用模幂计算 (n-1)^r 和 n^r,然后使用费马小定理使用模逆公式打印 P*Q^(-1),但这是不正确的,因为我认为 ( n^r) 模逆与 Q^(-1) 不同,如果我在不使用模幂运算的情况下计算 Q,它在 C++ 中甚至会溢出很长。 所以请指导我做错了什么?
ll modInverse(ll a, ll m)
{
ll ans = power(a, m-2, m); //for finding modular inverse
return ans;
}
ll power(ll x, ll y, ll p)
{
ll res = 1;
x = x % p;
while (y > 0) // ll is long long
{ //p=1000000007;
if (y & 1) //for calculating n^r and (n-1)^r
res = (res*x) % p;
y = y>>1;
x = (x*x) % p;
}
return res;
}
计算 P*Q^(-1) % 1000000007 会因为溢出而对大值给出意外的答案,并且如果使用 mod 1000000007 限制溢出会给出错误的值。 我使用费马小定理计算模逆和快速幂方法来评估 n^r。
为
【问题讨论】:
-
extended Euclidean algorithm 可用于求模逆。也许这种方法对中间结果的溢出更免疫(尽管我认为只要你的数字远低于 long long 可以保持的平方根,溢出不应该是使用费马小定理的问题,如果它已正确实施)。
-
实际上我试图找到 (10000^10000)^(-1)%1000000007 所以这就是为什么我得到错误的结果或数字溢出@JohnColeman
-
为什么不找到 (10000^10000)%1000000007 然后找到它的倒数呢?使用良好的模幂算法,溢出不是问题。
-
@JohnColeman 它会产生与第一个逆然后取模相同的结果吗?我目前也在做同样的事情,但我没有得到正确的结果,这是概率最大化游戏的任务
-
在任何组中(非零数 mod 1000000007 在模乘下形成一个组)
(a^k)^-1 = (a^-1)^k对于所有整数k。
标签: c++ math sum largenumber modular-arithmetic