在写这篇文章之前,xxx已经写过了几篇关于改主题的文章,想要了解的朋友可以去翻一下之前的文章
二分+倏地幂
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=33;
int n,k,mod;
typedef struct matrix
{
int data[maxn][maxn],size;
matrix(int n)
{
size=n;
memset(data,0,sizeof(data));
for(int i=1;i<=n;i++)
data[i][i]=1;
}
matrix operator + (const matrix &xx) const
{
matrix ans(size);
for(int i=1;i<=size;i++)
for(int j=1;j<=size;j++)
{
ans.data[i][j]=data[i][j]+xx.data[i][j];
ans.data[i][j]%=mod;
}
return(ans);
}
matrix operator * (const matrix &xx) const
{
matrix ans(size);
memset(ans.data,0,sizeof(ans.data));
for(int p=1;p<=size;p++)
for(int q=1;q<=size;q++)
for(int i=1;i<=size;i++)
{
ans.data[p][q]+=data[p][i]*xx.data[i][q];
ans.data[p][q]%=mod;
}
return(ans);
}
void prin()
{
for(int i=1;i<=size;i++)
{
for(int j=1;j<=size;j++)
printf("%d ",data[i][j]);
printf("\n");
}
}
};
matrix cal(matrix a,int k)
{
matrix ans(n);
while(k)
{
if(k&1)
ans=ans*a;
k>>=1;
a=a*a;
}
// ans.prin();
return(ans);
}
matrix work(matrix a,int k)
{
matrix ans(n),E(n);
if(k==1)
{
return(a);
}
ans=work(a,k/2);
ans=ans*(cal(a,k/2)+E);
if(k&1)
return(ans*a+a);
else
return(ans);
}
int main()
{
scanf("%d %d %d",&n,&k,&mod);
matrix a(n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&a.data[i][j]);
matrix ans(n);
ans=work(a,k);
ans.prin();
return 0;
}
文章结束给大家分享下程序员的一些笑话语录:
人脑与电脑的相同点和不同点,人脑会记忆数字,电脑也会记忆数字;人脑会记忆程序,电脑也会记忆程序,但是人脑具有感知能力,这种能力电脑无法模仿,人的记忆会影响到人做任何事情,但是电脑只有程序软件。比尔还表示,人脑与电脑之间最重要的一个差别就是潜意识。对于人脑存储记忆的特别之处,比尔表示,人脑并不大,但是人脑重要的功能是联络,人脑会把同样的记忆存储在不同的地方,因此记忆读取的速度就不相同,而这种速度取决于使用的频率和知识的重要性。人脑的记忆存储能力会随着年龄增长而退化,同时记忆的质量也会随着年龄退化。经典语录网