poj3233 hdu 1588 (矩阵)

poj3233

做其他的题,要用到矩阵求和的东西嘛,然后,发现不会。。看了好久,后来在纸上画了一下就明白啦。。真是不动手不行啊


//矩阵乘法  
//还是要写成结构体 比较清晰一些

#include
#include
#include
using namespace std;
#define  maxn 30

int n,m;
struct prog
{
	int mat[maxn][maxn];
	void init()
	{
		for(int i=0;i0)
	{
		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>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

hdu 1588

这个诡异的题n很大啊。。。

这里是一篇很给力的博客斐波那契序列 集锦 - Knuth_档案 - 博客园 

我的代码是用的二分和上面的题一样的

//矩阵乘法  
//还是要写成结构体 比较清晰一些

#include
#include
#include
using namespace std;
#define  maxn 30

int n,m;
struct prog
{
	int mat[maxn][maxn];
	void init()
	{
		for(int i=0;i0)
	{
		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>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




你可能感兴趣的:(数论,矩阵,二分,poj,hdu)