在编程练习中,我需要找出一个非常大的模数,例如2加到500000(输入的最大数),其中1000000007作为其他计算的一部分。
由于我可能需要多次发现,一种方法是创建一个5,00,000的数组。但它会的 阻止大量内存,所以我想知道有更好的方法吗?
答案 0 :(得分:5)
这是使用repeated squaring algorithm的绝佳时机。您可以按如下方式计算x y (mod modulus
):
int repeatedSquaring(int x, int y, int modulus) {
if (y == 0) return 1;
int val = repeatedSquaring(x, y / 2);
val = (val * val) % modulus;
if (y % 2 == 1) {
val = (val * x) % modulus;
}
return val;
}
该算法仅需要O(log y)乘法和模数来计算。此外,每个中间值最多为modulus
2 ,因此如果您的模数不是太大,您可以使用普通int
来进行计算。
希望这有帮助!
答案 1 :(得分:0)
这样简单的事情怎么样?:
#include <stdio.h>
unsigned long PowMod(unsigned long p)
{
unsigned long prod;
if (p == 0)
return 1;
if (p == 1)
return 2;
prod = PowMod(p / 2);
prod = (unsigned long long)prod * prod % 1000000007ULL;
if (p % 2 != 0)
{
prod = prod * 2 % 1000000007ULL;
}
return prod;
}
int main(void)
{
printf("%lu\n", PowMod(3));
printf("%lu\n", PowMod(4));
printf("%lu\n", PowMod(30));
printf("%lu\n", PowMod(31));
printf("%lu\n", PowMod(32));
printf("%lu\n", PowMod(33));
return 0;
}
输出(ideone):
8
16
73741817
147483634
294967268
589934536