HDU2256(矩阵)

HDU2256(矩阵)HDU2256(矩阵)

求(sqrt(2) + sqrt(3)) ^ 2n MOD 1024

强行盗图- -,这公式推得 。。


#include <iostream>
#include <cstdio>
using namespace std;
const int mod=1024;

struct Matri
{
    int a[2][2];
};
Matri Mat;

Matri Mul(const Matri &A,const Matri &B)
{
    Matri c;
    for(int i=0; i<2; i++)
    {
        for(int j=0; j<2; j++)
        {
            c.a[i][j]=0;
            for(int k=0; k<2; k++)
            {
                c.a[i][j]+=A.a[i][k]*B.a[k][j];
                c.a[i][j]%=mod;
            }
        }
    }
    return c;
}

Matri Pow(int n)
{
    if(n==1)
        return Mat;
    else if(n&1)
    {
        return Mul(Mat,Pow(n-1));
    }
    else
    {
        Matri temp=Pow(n>>1);
        return Mul(temp,temp);
    }
}

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        Mat.a[0][0] = 5;
        Mat.a[0][1] = 12;
        Mat.a[1][0]= 2;
        Mat.a[1][1] = 5;
        Matri tt;
        tt = Pow(n);
        int ans = (tt.a[0][0]*2 - 1)%mod;
        printf("%d
",ans);
    }
    return 0;
}