poj3233
做其他的题,要用到矩阵求和的东西嘛,然后,发现不会。。看了好久,后来在纸上画了一下就明白啦。。真是不动手不行啊
//矩阵乘法
//还是要写成结构体 比较清晰一些
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 30
int n,m;
struct prog
{
int mat[maxn][maxn];
void init()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)mat[i][j]=1;
else mat[i][j]=0; //初始化为单位矩阵
}
}
}
};
prog matrixmult(prog a,prog b) //求两个矩阵相乘
{
int i,j,k;
prog c;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
c.mat[i][j]=0;
for(k=0;k<n;k++)
c.mat[i][j]+=((a.mat[i][k]*b.mat[k][j])%m);
c.mat[i][j]%=m;
}
}
return c;
}
prog mult(prog s,int k)// 矩阵快速幂
{
prog ans;
ans.init();
while(k>0)
{
if(k&1)
ans=matrixmult(ans,s);
s=matrixmult(s,s);
k>>=1;
}
return ans;
}
prog matriplus(prog a,prog b)//矩阵相加
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
a.mat[i][j]+=b.mat[i][j];
a.mat[i][j]%=m;
}
}
return a;
}
prog dfs(prog s,int k) // 等比矩阵相加和
{
if(k==1)return s;
int i,j;
prog tmp;
tmp.init();
tmp=matriplus(tmp,mult(s,k>>1));// I+A^(k/2)
tmp=matrixmult(tmp,dfs(s,k>>1)); // A+A^2+A^3+A^4..A^(k/2)
if(k&1) tmp=matriplus(tmp,mult(s,k));
return tmp;
}
int main()
{
int i,j,k;
scanf("%d%d%d",&n,&k,&m);
prog a,res;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%d",&a.mat[i][j]);
}
res=dfs(a,k);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d%c",res.mat[i][j],j==n-1?'\n':' ');
}
}
hdu 1588
这个诡异的题n很大啊。。。
这里是一篇很给力的博客斐波那契序列 集锦 - Knuth_档案 - 博客园
我的代码是用的二分和上面的题一样的
//矩阵乘法
//还是要写成结构体 比较清晰一些
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 30
int n,m;
struct prog
{
int mat[maxn][maxn];
void init()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)mat[i][j]=1;
else mat[i][j]=0; //初始化为单位矩阵
}
}
}
};
prog matrixmult(prog a,prog b) //求两个矩阵相乘
{
int i,j,k;
prog c;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
c.mat[i][j]=0;
for(k=0;k<n;k++)
c.mat[i][j]+=((a.mat[i][k]*b.mat[k][j])%m);
c.mat[i][j]%=m;
}
}
return c;
}
prog mult(prog s,int k)// 矩阵快速幂
{
prog ans;
ans.init();
while(k>0)
{
if(k&1)
ans=matrixmult(ans,s);
s=matrixmult(s,s);
k>>=1;
}
return ans;
}
prog matriplus(prog a,prog b)//矩阵相加
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
a.mat[i][j]+=b.mat[i][j];
a.mat[i][j]%=m;
}
}
return a;
}
prog dfs(prog s,int k) // 等比矩阵相加和
{
if(k==1)return s;
int i,j;
prog tmp;
tmp.init();
tmp=matriplus(tmp,mult(s,k>>1));// I+A^(k/2)
tmp=matrixmult(tmp,dfs(s,k>>1)); // A+A^2+A^3+A^4..A^(k/2)
if(k&1) tmp=matriplus(tmp,mult(s,k));
return tmp;
}
int main()
{
int i,j,k;
scanf("%d%d%d",&n,&k,&m);
prog a,res;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%d",&a.mat[i][j]);
}
res=dfs(a,k);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d%c",res.mat[i][j],j==n-1?'\n':' ');
}
}