矩阵 构造 模板

F - Number Sequence

#include<iostream>
#include<cstdio>
using namespace std;
struct mat
{
    int ans[2][2];
};
mat I,MID;
int M;
mat cal(mat a,mat b)
{
    mat c;
    int i,j,k;
    for(i=0;i<2;i++)
        for(j=0;j<2;j++)
        {
            c.ans[i][j]=0;
            for(k=0;k<2;k++)
                c.ans[i][j]+=a.ans[i][k]*b.ans[k][j];
                c.ans[i][j]%=7;
        }
    return c;
}
mat atl(int n)
{
    mat res=MID;
    mat mid=I;
    while(n){
    if(n&1)
        res=cal(res,mid);
        mid=cal(mid,mid);
        n>>=1;}
        return res;
}
int main()
{
    int k,i,j;
    int a,b,n;
    while(scanf("%d%d%d",&a,&b,&n)!=-1)
    {
        if(a==0&&b==0&&n==0)
            break;
            I.ans[0][0]=a;
            I.ans[1][0]=b;
            I.ans[0][1]=1;
            I.ans[1][1]=0;
            MID.ans[0][0]=1;
            MID.ans[0][1]=1;
            MID.ans[1][0]=0;
            MID.ans[1][1]=0;
            if(n<3)
            printf("1 ");
            else{
                mat l=atl(n-2);
        printf("%d ",l.ans[0][0]);
            }
    }
    return 0;
}