3的幂的和

矩阵快速幂
1013 3的幂的和
1 秒 131,072 KB 20 分 3 级题
求:3^0 + 3^1 +…+ 3^(N) mod 1000000007
输入
输入一个数N(0 <= N <= 10^9)
输出
输出:计算结果
输入样例
3
输出样例
40


用矩阵快速幂做:

递推公式:
f ( n ) = 1 3 ∗ f ( n − 1 ) 3 n 0 3 3 n − 1 \begin{matrix} f(n) &amp; = &amp;1&amp; 3 &amp; *&amp; f(n-1)\\ 3^{n} &amp; &amp; 0 &amp;3&amp;&amp; 3^{n-1}\\ \end{matrix} f(n)3n=1033f(n1)3n1

ac的代码:
#pragma comment(linker, "/STACK:10240000,10240000")
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define ll long long
const int mod=1e9+7;
struct Mat
{
    ll m[2][2];
    Mat()
    {
        memset(m,0,sizeof(m));
    }
};
Mat pul(Mat A, Mat B)
{
    Mat C;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            for(int k=0;k<2;k++)
            {
                C.m[i][j]=(C.m[i][j]+A.m[i][k]*B.m[k][j])%mod;
            }
        }
    }
    return C;
}
Mat pow(Mat A, ll n)
{
    Mat B;
    for(int i=0;i<2;i++)
        B.m[i][i]=1;
    while(n)
    {
        if(n&1)
            B=pul(B, A);
        A=pul(A,A);
        n>>=1;
    }
    return B;
}
int main()
{
    ll n;
    scanf("%lld",&n);
    Mat A;
    A.m[0][0]=1;
    A.m[0][1]=A.m[1][1]=3;
    Mat B=pow(A, n);
    printf("%lld\n",(B.m[0][0]+B.m[0][1])%mod);
    return 0;
}

用逆元做:

A n s = 3 n + 1 − 1 2 m o d ( 1 e 9 + 7 ) = 2 模 1 e 9 + 7 的 逆 元 ∗ ( 3 n + 1 − 1 ) m o d ( 1 e 9 + 7 ) Ans = \frac{3^{n+1} -1} {2} mod(1e9+7) \\ = {2模1e9+7的逆元} *(3^{n+1} -1)mod(1e9+7) Ans=23n+11mod(1e9+7)=21e9+73n+11mod(1e9+7)

2模1e9+7的逆元是500000004 ,这个怎么求可参考:博客
#include<stdio.h>
#define mod 1000000007
typedef long long ll;

ll mod_pow(ll x,ll n)
{
    ll res = 1;
    while(n > 0)
    {
        if(n & 1)
            res = res * x % mod;
        x = x * x % mod;
        n >>= 1;
    }
    return res;
}

int main()
{
    ll n, ans;
    scanf("%lld", &n);
    ans = (mod_pow(3, n+1) - 1) * 500000004 % mod;    //求2的逆元即可.因为2 * ? = 1 (mod 1000000007)  ? = 500000004
    printf("%lld", ans);
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值