正确代码

版权声明: https://blog.csdn.net/qq_40829288/article/details/89443228

正确代码

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int maxn=31;
int n,k,mod;


struct mat
{
    int arr[maxn][maxn];
    mat()
    {
        memset(arr,0,sizeof(arr));
    }
};


mat mul(mat a,mat b)
{
    mat ret;
    for(int i=0;i<n;i++)
        for(int k=0;k<n;k++)
    {
        if(a.arr[i][k])
            for(int j=0;j<n;j++)
        {
            ret.arr[i][j]+=a.arr[i][k]*b.arr[k][j];
            if(ret.arr[i][j]>=mod)
                ret.arr[i][j]%=mod;
        }
    }
    return ret;
}

mat add(mat a,mat b)
{
    mat an;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {
            an.arr[i][j]=a.arr[i][j]+b.arr[i][j];
            if(an.arr[i][j]>=mod)
                an.arr[i][j]%=mod;
        }
    return an;
}

mat power(mat p,int k)
{
    if(k==1) return p;
    mat e;
    for(int i=0;i<n;i++)
        e.arr[i][i]=1;
    if(k==0) return e;
    while(k)
    {
        if(k&1)
            e=mul(p,e);
        p=mul(p,p);
        k>>=1;
    }
    return e;
}

void output(mat ans)
{
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
    {
        if(j==n-1)
            cout<<ans.arr[i][j]<<endl;
        else
            cout<<ans.arr[i][j]<<" ";
    }
}

mat  cal(mat ori,int k)
{
    if(k==1) return ori;
    if(k&1)
        return add(cal(ori,k-1),power(ori,k));//当k为奇数时,减1变为偶数 S(K)=S(K-1)+ori^K
    else
        return mul(add(power(ori,0),power(ori,k>>1)),cal(ori,k>>1));
        //当K为偶数时,S(K)=(1+ori^(K/2))*S(K/2)
}

int main()
{
    while(scanf("%d%d%d",&n,&k,&mod)!=EOF)
    {
        mat ori,ans;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
        {
            scanf("%d",&ori.arr[i][j]);
            if(ori.arr[i][j]>=mod)
                ori.arr[i][j]%=mod;
        }
        ans=cal(ori,k);
        output(ans);
    }
    return 0;
}
posted @ 2019-04-21 21:56 Youpeng 阅读( ...) 评论( ...) 编辑 收藏

猜你喜欢

转载自blog.csdn.net/qq_40829288/article/details/89443228