| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
感觉写的很清晰解法二 700K 141MS
#include<cstdio>
#include<iostream>
using namespace std;
int k,n,base;
struct matrix
{
int n;
int m[33][33];
void clear()
{
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
m[i][j]=0;
}
void in(int t)
{
n=t;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
scanf("%d",&m[i][j]);
}
void out()
{
for (int i=1;i<=n;i++)
{
for (int j=1;j<n;j++)
printf("%d ",m[i][j]);
printf("%d\n",m[i][n]);
}
}
void operator +=(const matrix &b)
{
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
m[i][j]=(m[i][j]+b.m[i][j])%base;
}
}a,b,f;
matrix operator *(const matrix &a,const matrix &b)
{
matrix c;
c.n=n;
c.clear();
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
for (int k=1;k<=n;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%base;
return c;
}
int main()
{
scanf("%d%d%d",&n,&k,&base);
a.in(n);
b=a;
f=a;
int i;
for (i=0;(1<<i)<=k;i++);
for (i-=2;i>=0;i--)
{
f+=b*f;
b=b*b;
if (((1<<i)&k)>0) b=b*a,f+=b;
}
f.out();
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator