【发布时间】:2021-10-17 12:19:00
【问题描述】:
以 5^100000 为例
在竞争性编程中给出了一个约束,因为我们应该在 10^9+7 下计算我理解他们为什么使用它(以防止溢出) 但我的问题是如果乘法产生的数字超过 10^9+7,那么它会回绕,所以答案不是我们正在寻找的确切值。 取模后得到的这个值在现实世界的问题中仍然有用吗?还是以某种方式转换了?
示例代码
#define N 1000000007 // prime modulo value
long int exponentiation(long int base,
long int exp)
{
if (exp == 0)
return 1;
if (exp == 1)
return base % N;
long int t = exponentiation(base, exp / 2);
t = (t * t) % N;
// if exponent is even value
if (exp % 2 == 0)
return t;
// if exponent is odd value
else
return ((base % N) * t) % N;
}
int main()
{
long int base = 5;
long int exp = 100000;
long int modulo = exponentiation(base, exp);
cout << modulo << endl;
return 0;
}
输出
754573817
【问题讨论】:
-
哦,令人震惊的认识。 :P 您所做的最具竞争力的编程练习可能没有实际用途。
-
投票关闭“基于意见”。这个问题你不一定能得到正确答案。只抨击竞争性编程和在渲染和密码学等其他领域使用模数的轶事。
-
如果模幂运算没有给出“你正在寻找的值”,那么它是不合适的。否则就是这样。
-
模运算在现实世界中有许多合法用途。应用于任何特定问题的答案的模运算是否有意义取决于问题。大多数竞争性编程问题本身在现实世界中毫无意义,即使在模之前也是如此。
-
PKI 模数 - 研究公钥密码学