直接暴力不行
因为每项底数都是A 可以用结合律 可以找到递推式
如果k是奇数 那么dfs(k) = dfs(k-1)+A^k
否则 dfs(k) = dfs(k/2)+A^k*(dfs(k/2))//先把dfs(k/2)算出来再带进去
主要是
初始化一开始写成void函数的形式导致初始化失败
然后怎么改怎么wa
还有全局变量和局部变量冲突!!!!
花式过样例 可你就是wa 为啥?为啥?哈哈哈
#include<stdio.h>
#include <math.h>
#include <cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int MAXN = 1e5;
struct mat{
int rix[35][35];
};
int n,k,m;
mat st;
void init(mat t){
for (int i = 0;i < n; ++i)
for (int j = 0;j < n; ++j) t.rix[i][j] = 0;
}
mat mul(mat a,mat b){
mat c;
for (int i = 0;i < n; ++i) for (int j = 0;j < n; ++j) c.rix[i][j] = 0;
for (int i = 0;i < n; ++i){
for (int j = 0;j < n; ++j){
for (int k = 0;k < n; ++k){
c.rix[i][j] += a.rix[i][k]*b.rix[k][j];
c.rix[i][j] %= m;
}
}
}
return c;
}
mat q_mod(mat a,int b){
mat tm;
for (int i = 0;i < n; ++i) for (int j = 0;j < n; ++j) tm.rix[i][j] = (i==j);
while (b){
if (b&1) tm = mul(tm,a);
a = mul(a,a);
b>>=1;
}
return tm;
}
mat Sum(mat a,mat b){
mat c;
for (int i = 0;i < n; ++i) for (int j = 0;j < n; ++j) c.rix[i][j] = 0;
for (int i = 0;i < n; ++i){
for (int j = 0;j < n; ++j){
c.rix[i][j] = a.rix[i][j] + b.rix[i][j];
c.rix[i][j] %= m;
}
}
return c;
}
mat dfs(int cc){
if (cc==1) return st;
if (cc&1) return Sum(dfs(cc-1),q_mod(st,cc));
else {
mat ret = dfs(cc/2);
return Sum(ret,mul(q_mod(st,cc/2),ret));
}
}
int main()
{
scanf("%d%d%d",&n,&k,&m);
for (int i = 0;i < n; ++i){
for (int j = 0;j < n; ++j) scanf("%d",&st.rix[i][j]);
}
mat ans = dfs(k);
for (int i = 0;i < n; ++i){
for (int j = 0;j < n; ++j){
printf("%d%c",ans.rix[i][j],j==n-1?'\n':' ');
}
}
return 0;
}