【问题标题】:how to calculate 2^n modulo 1000000007 , n = 10^9如何计算 2^n 模 1000000007 , n = 10^9
【发布时间】:2014-07-13 20:16:13
【问题描述】:

最快的计算方法是什么,我看到一些人使用矩阵,当我在互联网上搜索时,他们谈到了特征值和特征向量(不知道这些东西)......有一个问题减少了到一个递归方程 f(n) = (2*f(n-1)) + 2 和 f(1) = 1, n 最高可达 10^9.... 我已经尝试过使用 DP,最多存储 1000000 个值并使用常见的快速求幂方法,它都超时了 我在这些模数问题上通常很弱,需要计算很大的值

【问题讨论】:

标签: math matrix eigenvector eigenvalue exponentiation


【解决方案1】:
f(n) = (2*f(n-1)) + 2 with f(1)=1

等价于

(f(n)+2) = 2 * (f(n-1)+2)
         = ...
         = 2^(n-1) * (f(1)+2) = 3 * 2^(n-1)

这样终于

f(n) = 3 * 2^(n-1) - 2

然后您可以在其中应用快速模块化电源方法。

【讨论】:

  • 对德语感兴趣的朋友,我依稀记得Otto Forster的教科书《Algorithmische Zahlentheorie》中所涉及的主题。
【解决方案2】:

平方乘法的模幂运算:

function powerMod(b, e, m)
    x := 1
    while e > 0
        if e%2 == 1
            x, e := (x*b)%m, e-1
        else b, e := (b*b)%m, e//2
    return x

【讨论】:

  • 这是一个了不起的解决方案
【解决方案3】:

计算2^n的C代码

    const int mod = 1e9+7;

    //Here base is assumed to be 2
    int cal_pow(int x){
        int res;
        if (x == 0) res=1;
        else if (x == 1)    res=2;
        else {
            res = cal_pow(x/2);
            if (x % 2 == 0) 
                res = (res * res) % mod;
            else
                res = (((res*res) % mod) * 2) % mod;
        }
        return res;
    }

【讨论】:

  • 也许是的,但它仍然需要一些修改。对吗?
  • 没有检查结果,但看到它的作用,你应该暂时删除它
  • 进行了必要的更改,但不会产生直接结果!
猜你喜欢
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多