hdu1005(矩阵快速幂)

为了练习使用矩阵快速幂就写了矩阵快速幂,其实这道题更方便的做法是找规律,由于n由n-1和n-2确定,而n-1和n-2范围是0到6,所以共有7*7=49种结果,所以49必定是一个循环。

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<map>
#define MAX 3
#define MOD 7
using namespace std;

struct matr
{
    int m[MAX][MAX];
    void ini()
    {
        for(int i=1;i<=MAX;i++)
        {
            for(int j=1;j<=MAX;j++)
            {
                m[i][j]=0;
            }
        }
    }
}res;

//int pow(int a,int b)
//{
//    int ans=1;
//    while(b)
//    {
//        if(b&1)ans=ans*a%MOD;
//        a=a*a%MOD;
//        b/=2;
//    }
//    return ans;
//}

matr mul(matr a,matr b,int n)
{
    matr t;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            t.m[i][j]=0;
        }
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
    {
            for(int k=1;k<=n;k++)
            {
                t.m[i][j]+=a.m[i][k]*b.m[k][j];
                t.m[i][j]%=MOD;
            }
    }
    return t;
}

matr mpower(matr a,int b,int m)
{
    matr ans;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=m;j++)
    {
        if(i==j)
            ans.m[i][j]=1;
        else
            ans.m[i][j]=0;
    }
    while(b>0)
    {
        if(b&1) ans=mul(ans,a,m);
        a=mul(a,a,m);
        b/=2;
    }
    return ans;
}


int main(){
    int a,b,c;
    while(cin>>a>>b>>c&&a&&b&&c)
    {
        if(c==1){printf("1\n");continue;}
        else if(c==2){printf("1\n");continue;}
        matr base,orig;
        memset(base.m,0,sizeof(base.m));
        base.m[1][1]=a;
        base.m[1][2]=b;
        base.m[2][1]=1;

        memset(orig.m,0,sizeof(orig));
        orig.m[1][1]=1;
        orig.m[2][1]=1;

        matr temp=mpower(base,c-2,2);
        temp=mul(temp,orig,2);
        cout<<temp.m[1][1]<<endl;

    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/sadsummerholiday/article/details/83240689