AC日记——3的幂的和 51nod 1013

Posted Only U - IU

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AC日记——3的幂的和 51nod 1013相关的知识,希望对你有一定的参考价值。

3的幂的和

 

思路;

  矩阵快速幂;

    sn-1      3 1        sn

      *          =

  1      0 1     1

 

来,上代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define mod 1000000007

struct NodeType {
    long long a[3][3];
};
struct NodeType ans;

long long n;

struct NodeType mul(NodeType pos)
{
    NodeType res;
    res.a[1][1]=0,res.a[1][2]=0;
    res.a[2][1]=0,res.a[2][2]=0;
    for(int i=1;i<=2;i++)
    {
        for(int j=1;j<=2;j++)
        {
            for(int v=1;v<=2;v++)
            {
                res.a[i][j]=(res.a[i][j]+(pos.a[i][v]*pos.a[v][j])%mod)%mod;
            }
        }
    }
    return res;
}

void poww(int mi)
{
    NodeType pos;
    pos.a[1][1]=3,pos.a[1][2]=1;
    pos.a[2][1]=0,pos.a[2][2]=1;
    while(mi>0)
    {
        struct NodeType res;
        res.a[1][1]=0,res.a[1][2]=0;
        res.a[2][1]=0,res.a[2][2]=0;
        if(mi&1)
        {
            for(int i=1;i<=2;i++)
            {
                for(int j=1;j<=2;j++)
                {
                    for(int v=1;v<=2;v++)
                    {
                        res.a[i][j]=(res.a[i][j]+(ans.a[i][v]*pos.a[v][j])%mod)%mod;
                    }
                }
            }
            ans=res;
        }
        pos=mul(pos),mi=mi>>1;
    }
}

int main()
{
    scanf("%lld",&n);n--;
    ans.a[1][1]=3,ans.a[1][2]=1;
    ans.a[2][1]=0,ans.a[2][2]=1;
    poww(n);
    cout<<(ans.a[1][1]+ans.a[1][2])%mod;
    return 0;
}

 

以上是关于AC日记——3的幂的和 51nod 1013的主要内容,如果未能解决你的问题,请参考以下文章

51 NOD 1013 3的幂的和

51Nod - 1013 - 3的幂的和(分治快速幂)

51 Nod 1013 3的幂的和 矩阵链乘法||逆元+快速幂

51Nod 1013 3的幂的和 快速幂 | 乘法逆元 | 递归求和公式

AC日记——还是01串 51nod 1396

AC日记——N的倍数 51nod 1103