【发布时间】:2012-07-02 07:39:08
【问题描述】:
对于1 <= <i>N</i> <= 1000000000,我需要计算2<sup><i>N</i></sup> mod 1000000007,而且速度一定非常快!
我目前的做法是:
ull power_of_2_mod(ull n) {
ull result = 1;
if (n <= 63) {
result <<= n;
result = result % 1000000007;
}
else {
ull one = 1;
one <<= 63;
while (n > 63) {
result = ((result % 1000000007) * (one % 1000000007)) % 1000000007;
n -= 63;
}
for (int i = 1; i <= n; ++i) {
result = (result * 2) % 1000000007;
}
}
return result;
}
但它似乎不够快。有什么想法吗?
【问题讨论】:
-
看起来真的很好恕我直言。也许我会删除第一个
if,即总是转到一般情况。 -
这是数学题... 1000000007 是素数,你应该看看这里:math.sunysb.edu/~scott/blair/Powers_modulo_prime.html
-
@astreal:非常感谢。我应该知道
prime,耻辱!
标签: c++ c algorithm optimization numbers