ACM-数论-矩阵快速幂 POJ3233 矩阵快速幂

这里是题面

这个是写得最好的题解

下次再来补坑

注意一点:矩阵开long long 会超时,矩阵必须开到60+,不然会RE

#include<iostream>
#include<cstdio> 
#include<string.h>
using namespace std;
typedef long long ll;
int g;
int mod;
struct mx{
    int v[65][65];//ll会超时%因为取模,所以不需要ll 
}a;
mx mul(mx a,mx t,int g){
    mx res;
    memset(res.v,0,sizeof(res.v));
    for(int i=0;i<g;i++){
        for(int j=0;j<g;j++){
            for(int k=0;k<g;k++){
                res.v[i][j]+=(a.v[i][k]%mod)*(t.v[k][j]%mod)%mod;
                res.v[i][j]%=mod;
            } 
        }
    }
    return res;
}
mx power(mx a,ll b,int g){
    mx ans;
    memset(ans.v,0,sizeof(ans.v));
    for(int i=0;i<g;i++)ans.v[i][i]=1;
    while(b>0){
        if(b&1)ans=mul(ans,a,g);
        b=b>>1;
        a=mul(a,a,g);
    }
    return ans;
}
int main(){
    int n;
    ll k;
    while(scanf("%d%lld%d",&n,&k,&mod)==3){
        g=n*2;
        memset(a.v,0,sizeof(a.v));
        int i,j;
        for(i=0;i<g;i++){
            for(j=0;j<n;j++){
                if(i<n)scanf("%d",&a.v[i][j]);
            }
            if(i<n)a.v[i][i+n]=1;
            else a.v[i][i]=1;
        }
        /*for(int i=0;i<g;i++){
            for(int j=0;j<g;j++)cout<<a.v[i][j]<<" ";
            cout<<endl;
        }*/
        mx m=power(a,k+1,g);
        for(i=0;i<n;i++){
            for(j=n;j<g;j++){
                if(j==i+n)m.v[i][j]=(m.v[i][j]-1+mod)%mod;
                printf("%d",m.v[i][j]);//cout<<;
                if(j<g-1)printf(" ");
            }
            printf("\n");//cout<<endl;
        }
    }
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值