HDU1005(矩阵快速幂)

 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005

#include<cstdio>
using namespace std;
int n,a,b;
struct Matrix
{
    int m[2][2];
    void init()
    {
        m[0][0] = a;
        m[0][1] = 1;
        m[1][0] = b;
        m[1][1] = 0;
    }
    void init0()
    {
        m[0][0] = a+b;
        m[0][1] = 1;
        m[1][0] = 1;
        m[1][1] = 1;
    }
    void init2()
    {
        m[0][0] = 1;
        m[0][1] = 0;
        m[1][0] = 0;
        m[1][1] = 1;
    }
    Matrix operator * (Matrix t)
    {
        Matrix res;
        for (int i = 0 ;i < 2; i++)
        {
            for (int j = 0 ;j < 2 ;j++)
            {
                res.m[i][j] = 0;
                for (int k = 0 ;k < 2 ;k++)
                    res.m[i][j] += (m[i][k] * t.m[k][j]);
                res.m[i][j] %= 7;
            }
        }
        return res;
    }
};
Matrix quickpow(Matrix s,int k)
{
    Matrix res;
    res.init2();
    while(k)
    {
        if(k & 1)
            res = res * s;
        k >>= 1;
        s = s * s;
    }
    return res;
}
int main()
{
    while(scanf("%d %d %d",&a,&b,&n) && (a || b || n))
    {
        if(n == 1|| n == 2)
        {
            printf("1\n");
            continue;
        }
        Matrix ans;
        ans.init0();
        Matrix t;
        t.init();
        ans = ans * quickpow(t ,n-2);
        printf("%d\n",ans.m[0][1] % 7);
    }
    return 0;
}

 


posted on 2016-09-03 13:29  polarday  阅读(220)  评论(0编辑  收藏  举报

导航