【HDOJ 1005】 Number Sequence (裸矩阵快速幂)

【HDOJ 1005】 Number Sequence

原谅我贴个水题。。。攒了一年的'恩怨'终于了解了 b( ̄▽ ̄)d

去年就接触过矩阵快速幂 线代太弱  看他们代码没参悟透。。可能真是悟性太差了。。

然后一只以为矩阵快速幂是很叼的东西(不过确实很叼) 太高深 再没敢碰。。有毒啊…………

直到最近比赛(VJ)出现矩阵快速幂的频率太高了 今下午又来一道 金巨巨看我万般费解 上来一张纸 一支笔 一个Fibonacci

妥妥的把矩阵快速幂给我讲懂了 学好线代是多么的重要。。。(~﹃~)~zZ

回来找了这么个题练了练手 自己写写就是感觉不一样 太有成就感了 弱渣的第一个矩快


丢水题代码跑掉ε=ε=ε=(~ ̄▽ ̄)~

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

typedef struct Matrix
{
    int mx[2][2];
    void Init(int a,int b)
    {
        mx[0][0] = a;
        mx[0][1] = b;
        mx[1][0] = 1;
        mx[1][1] = 0;
    }

    void Out()
    {
        for(int i = 0; i < 2; ++i)
        {
            for(int j = 0; j < 2; ++j)
                printf("%d ",mx[i][j]);
            puts("");
        }
    }

    struct Matrix operator * (const struct Matrix a)const
    {
        struct Matrix x;
        memset(x.mx,0,sizeof(x.mx));
        for(int i = 0; i < 2; ++i)
            for(int j = 0; j < 2; ++j)
                for(int k = 0; k < 2; ++k)
                    x.mx[i][j] = (x.mx[i][j]+mx[i][k]*a.mx[k][j])%7;
        return x;
    };
}Matrix;

Matrix pow(Matrix mx,int n)
{
    Matrix ans;
    ans.mx[0][0] = ans.mx[1][1] = 1;
    ans.mx[0][1] = ans.mx[1][0] = 0;
    while(n)
    {
        if(n&1) ans = ans*mx;
        mx = mx*mx;
        n >>= 1;
    }
    return ans;
}

int main()
{
    int n,a,b;
    while(~scanf("%d %d %d",&a,&b,&n) &&a)
    {
        if(n == 1)
        {
            puts("1");
            continue;
        }
        Matrix mx;
        mx.Init(a,b);
        mx = pow(mx,n-2);
        //mx.Out();
        printf("%d\n",(mx.mx[0][0]+mx.mx[0][1])%7);
    }
    return 0;
}


你可能感兴趣的:(【HDOJ 1005】 Number Sequence (裸矩阵快速幂))