51nod1242【矩阵快速幂】

基础题。。
wa在n的范围需要用long long
= =、长个记性

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const LL mod=1e9+9;

struct asd{
    LL a[2][2];
};

asd mul(asd x,asd y)
{
    asd ans;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            ans.a[i][j]=0;
            for(int k=0;k<2;k++)
            {
                ans.a[i][j]=ans.a[i][j]+(x.a[i][k]*y.a[k][j])%mod;
                ans.a[i][j]%=mod;
            }
        }
    }
    return ans;
}
asd quickmul(LL g,asd x)
{
    asd ans;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            if(i==j) ans.a[i][j]=1;
            else ans.a[i][j]=0;
        }
    }
    while(g)
    {
        if(g&1) ans=mul(ans,x);
        x=mul(x,x);
        g>>=1;
    }
    return ans;
}

int main()
{
    LL n;
    scanf("%lld",&n);
    if(n==0||n==1)
    {
        printf("%lld
",n);
        return 0;
    }
    asd x,ans;
    x.a[0][0]=1;x.a[0][1]=1;
    x.a[1][0]=1;x.a[1][1]=0;
    ans=quickmul(n-1,x);
    printf("%lld
",ans.a[0][0]);
    return 0;
}
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934780.html