DUTOJ 1287: 昨日头条上的Zeratul

在这里插入图片描述

在这里插入图片描述
学校的oj前端改版 首页好评

矩阵快速幂 先写好举证乘法 在数值快速的地方替换成矩阵乘法即可
用int会超范围 改用long long
codeblocks
我先在矩阵的结构体里面重载了 * 号 之后报错
internal compiler error: Segmentation fault
把乘法写在结构体外面就好了很迷

#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;
typedef long long LL;
#define maxN  101
#define mod 1000000007
#define debug(x) cout<<#x<<": "<<x<<endl;


struct mat{

    LL m;
    LL n;
    LL a[101][101];
    mat(){}
    mat(LL m,LL n):m(m),n(n){memset(a,0,sizeof(a));}

    void disp(){
        for(LL i=0;i<this->m;i++){
            for(LL j=0;j<this->n;j++){
                 cout<<this->a[i][j]<<" ";
            }
            cout<<endl;
        }
        cout<<endl;
    }
};

mat mul(mat aa,mat bb){
    mat ret(aa.m,bb.n);
    for(LL i=0;i<aa.m;i++){
        for(LL j=0;j<bb.n;j++){
            for(LL k=0;k<bb.m;k++){
                ret.a[i][j] += aa.a[i][k] * bb.a[k][j] + mod;
                //debug(this->a[i][k] * b.a[k][j]);
                ret.a[i][j] = (ret.a[i][j]+mod)%mod;
            }
        }
    }
    return ret;
}

LL powmat(mat m1,LL n){
    mat ret(m1.m,m1.m);
    memset(ret.a,0,sizeof(ret.a));
    for(LL i=0;i<m1.m;i++){
        ret.a[i][i] = 1;
    }
    while(n){
        if(n&1){
            ret = mul(ret,m1);
        }
        m1 = mul(m1,m1);
        n>>=1;
    }
    return ret.a[0][0];
}

int main()
{
    LL m;
    LL n;
    while(~scanf("%lld%lld",&m,&n)){

        mat m1(m,m);
        for(LL i=0;i<m;i++){
            //m1.a[i][i] = 1;
            m1.a[i][ (i+1)%m ] = 1;
            m1.a[i][ (i+m-1)%m ] = 1;
            m1.a[(i+1)%m][i] = 1;
            m1.a[(i+m-1)%m][i] = 1;
        }
        printf("%lld\n",(powmat(m1,n)+mod)%mod);

    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值