题目大意:求S =( A + A2 +A3 + … + Ak)%m的值
矩阵推导,推导矩阵:
A A
0 1
矩阵快速幂即可:
AC program:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iomanip>
using namespace std;
int mm[35][35];
int n,k,m;
struct matrix
{
int map[65][65]; //初始化?
}tmp,ans,ju;
void init()
{
for(int i=1;i<=n;i++)
for(int g=1;g<=n;g++)
cin>>mm[i][g];
memset(ju.map,0,sizeof(ju.map));
memset(tmp.map,0,sizeof(tmp.map));///
memset(ans.map,0,sizeof(ans.map));///
for(int i=1;i<=n;i++)
for(int g=1;g<=n;g++)///
{
ju.map[i][g]=mm[i][g];
ju.map[i][g+n]=mm[i][g];
}
for(int i=1;i<=n;i++)
{
ju.map[n+i][n+i]=1;
}
/*cout<<"-------------ju"<<endl;
for(int i=1;i<=2*n;i++)
{
for(int g=1;g<=2*n;g++)
cout<<ju.map[i][g]<<" ";
cout<<endl;
}
cout<<"------------ju"<<endl; */
}
matrix fn(matrix uu,matrix vv)
{
matrix kg;
memset(kg.map,0,sizeof(kg.map));///
for(int i=1;i<=2*n;i++)///注意循环系数
for(int k=1;k<=2*n;k++)
for(int g=1;g<=2*n;g++)
{
kg.map[i][g]=(kg.map[i][g]+uu.map[i][k]*vv.map[k][g]%m)%m;
}
return kg;//为什么没有返回页正确?
}
matrix qmod(int r)
{
if(r==1)return ju;
tmp=qmod(r/2);
ans=fn(tmp,tmp);
if(r&1)return fn(ans,ju);
return ans;
}
int main ()
{
cin>>n>>k>>m;
init();
matrix result=qmod(k);
for(int i=1;i<=n;i++)
{
for(int g=1;g<=n;g++)
{
if(g!=n)
cout<<result.map[i][g+n]<<" ";
else
cout<<result.map[i][g+n];
}
cout<<endl;
}
//system("pause");
return 0;}