hdu 2256 Problem of Precision 矩阵

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
const int mod=1024;
struct matrix{
    int f[2][2];
};
matrix mul(matrix a,matrix b)
{
    matrix c;
    memset(c.f,0,sizeof(c.f));
    int i,j,k;
    for(k=0;k<2;k++)
    {
        for(i=0;i<2;i++)
        {
            if(!a.f[i][k])continue;
            for(j=0;j<2;j++)
            {
                if(!b.f[k][j])continue;
                c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[k][j])%mod;
            }
        }
    }
    return c;
}
matrix pow_mod(matrix a,int b)
{
    matrix s;
    int i,j;
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
        s.f[i][j]=(i==j?1:0);
    while(b)
    {
        if(b&1)
            s=mul(s,a);
        a=mul(a,a);
        b=b>>1;
    }
    return s;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n;
        cin>>n;
        int p,q;
        p=10;q=-1;
        matrix e;
        e.f[0][0]=p;e.f[0][1]=1;
        e.f[1][0]=q;e.f[1][1]=0;
        e=pow_mod(e,n-1);
        int ans=0;
        ans=(10*e.f[0][0]+2*e.f[1][0]-1)%mod;
        cout<<(ans+mod)%mod<<endl;
    }
    return 0;
}
/*
    (sqrt(2)+sqrt(3))^(2*n)=(5+2*sqrt(6))^n
    二项式展开下就可以知道(5+2*sqrt(6))^n+(5-2*sqrt(6))^n为整数
    0<5-2*sqrt(6)<1,令a=5+2*sqrt(6),b=5-2*sqrt(6),p=a+b,q=-a*b,f[n]=a^n+b^n;
    答案ans=f[n]-1;
    f[n]=(a+b)*f[n-1]-a*b*f[n-2];
    得到矩阵:
        |f[n-1] f[n-2]|*|p 1|=|f[n] f[n-1]|
                        |q 0|
    求解矩阵乘法就可得到答案
*/

你可能感兴趣的:(矩阵)