HDU 4291 A Short problem

      通过矩阵快速幂找循环节,注意要每一层都要找一次循环节。。。发个题解仅供大家对拍。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define MAXN 2
#define LL long long

LL MOD;
struct Matrix
{
    LL data[MAXN][MAXN];
    void init()
    {
        for(LL i=0; i<MAXN; i++)
            for(LL j=0; j<MAXN; j++)
                data[i][j]=0;
    }
};

Matrix Multy(Matrix m1,Matrix m2)
{
    Matrix r;
    r.init();
    for(LL i=0; i<2; i++)
        for(LL j=0; j<2; j++)
            for(LL k=0; k<2; k++)
                r.data[i][j]=(r.data[i][j]+(m1.data[i][k]*m2.data[k][j])%MOD)%MOD;
    return r;
}
Matrix Fast_mi(Matrix ma,LL m)
{
    Matrix r;
    r.init();
    for(LL i=0; i<2; i++)
        r.data[i][i]=1;
    while(m)
    {
        if(m&1)r=Multy(r,ma);
        ma=Multy(ma,ma);
        m=m>>1;
    }
    return r;
}

Matrix a;

int main()
{
    //freopen("input.txt", "r", stdin);
    a.data[0][0] = 3;
    a.data[0][1] = 1;
    a.data[1][0] = 1;
    a.data[1][1] = 0;
    LL n, g, i, f, j;
    while(cin >> n)
    {
        n %= 240;
        g = n;
        if(!g)
        {
            cout << "0" << endl;
            continue;
        }
        MOD = 183120;
        g = Fast_mi(a, n - 1).data[0][0];
        MOD = 222222224;
        g = Fast_mi(a, g - 1).data[0][0];
        MOD = 1000000007;
        g = Fast_mi(a, g - 1).data[0][0];
        cout << g << endl;
    }
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值