#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string.h>
#define inf 0x3f3f3f
using namespace std;
int n;
struct mat
{
int matrix[33][33];
}
;
typedef struct mat Matrix;
Matrix mul(Matrix a, Matrix b,int m)
{
Matrix reslut;
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < n; j++)
{
reslut.matrix[i][j] = 0 ;
for(int k = 0 ; k < n; k++)
{
reslut.matrix[i][j] = ( reslut.matrix[i][j] + a.matrix[i][k]*b.matrix[k][j])%m;
}
}
}
// printf("^^^^");
return reslut;
}
Matrix qsm(int k,Matrix h,int m)
{
Matrix c;
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < n ; j++)
{
if(i == j)
c.matrix[i][j] = 1;
else
c.matrix[i][j] = 0;
}
}
while(k)
{
if(k & 1)
{
c = mul(c,h,m);
}
h = mul(h,h,m);
k = k >> 1;
}
return c;
}
Matrix plu(Matrix a,Matrix b,int m)
{
Matrix q;
for(int e = 0 ; e < n ; e++)
{
for(int f = 0 ; f < n ; f++)
{
q.matrix[e][f] = (a.matrix[e][f] + b.matrix[e][f] )%m;
}
}
return q;
}
Matrix sum(int k,Matrix s,int m)
{
Matrix p,x,y,z,r,t;
int l;
if(k == 1)return s;
else
{
if(k % 2 == 0)
{
l = k/2;
p = sum(l,s,m);
x = qsm(l,s,m);
y = mul(p,x,m);
z = plu(p,y,m);
return z;
}
else
{
l = (k-1)/2;
p = sum(l,s,m);
x = qsm(l,s,m);
y = mul(p,x,m);
r = plu(p,y,m);
t = qsm(k,s,m);
z = plu(r,t,m);
return z;
}
}
}
int k,m;
Matrix ans,d;
int main()
{
while(scanf("%d%d%d",&n,&k,&m) != EOF)
{
for(int i = 0 ; i < n ; i++)
{
for(int j = 0; j < n; j++)
{
scanf("%d",&d.matrix[i][j]);
}
}
ans = sum(k,d,m);
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < n ; j++)
{
printf("%d",ans.matrix[i][j]);
if(j != n-1)printf(" ");
}
printf("\n");
}
}
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string.h>
#define inf 0x3f3f3f
using namespace std;
int n;
struct mat
{
int matrix[33][33];
}
;
typedef struct mat Matrix;
Matrix mul(Matrix a, Matrix b,int m)
{
Matrix reslut;
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < n; j++)
{
reslut.matrix[i][j] = 0 ;
for(int k = 0 ; k < n; k++)
{
reslut.matrix[i][j] = ( reslut.matrix[i][j] + a.matrix[i][k]*b.matrix[k][j])%m;
}
}
}
// printf("^^^^");
return reslut;
}
Matrix qsm(int k,Matrix h,int m)
{
Matrix c;
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < n ; j++)
{
if(i == j)
c.matrix[i][j] = 1;
else
c.matrix[i][j] = 0;
}
}
while(k)
{
if(k & 1)
{
c = mul(c,h,m);
}
h = mul(h,h,m);
k = k >> 1;
}
return c;
}
Matrix plu(Matrix a,Matrix b,int m)
{
Matrix q;
for(int e = 0 ; e < n ; e++)
{
for(int f = 0 ; f < n ; f++)
{
q.matrix[e][f] = (a.matrix[e][f] + b.matrix[e][f] )%m;
}
}
return q;
}
Matrix sum(int k,Matrix s,int m)
{
Matrix p,x,y,z,r,t;
int l;
if(k == 1)return s;
else
{
if(k % 2 == 0)
{
l = k/2;
p = sum(l,s,m);
x = qsm(l,s,m);
y = mul(p,x,m);
z = plu(p,y,m);
return z;
}
else
{
l = (k-1)/2;
p = sum(l,s,m);
x = qsm(l,s,m);
y = mul(p,x,m);
r = plu(p,y,m);
t = qsm(k,s,m);
z = plu(r,t,m);
return z;
}
}
}
int k,m;
Matrix ans,d;
int main()
{
while(scanf("%d%d%d",&n,&k,&m) != EOF)
{
for(int i = 0 ; i < n ; i++)
{
for(int j = 0; j < n; j++)
{
scanf("%d",&d.matrix[i][j]);
}
}
ans = sum(k,d,m);
for(int i = 0 ; i < n ; i++)
{
for(int j = 0 ; j < n ; j++)
{
printf("%d",ans.matrix[i][j]);
if(j != n-1)printf(" ");
}
printf("\n");
}
}
}
终于给KO掉了..哈哈,
总结,1.在求次幂那里,还是只记得之前用过的求斐波那契数列的初始化{1,0,0,1},导致没初始化直接错了.
2..在sum中,最开始是一股脑的全部搞,导致数据出现每次都不一样的结果,所以以后不要这样子,应该每一步分开来算,这样也好查错。
3.。二分,这个题目使得我对二分也有了更好的理解。恩恩 加油。