hdu 2842 Chinese Rings(矩阵乘法+递推)

分析:要摘下或着是装上第n个环的条件是:第n-1个环要在杆上,前n-2个环要不在杆上。

故:f(n)=f(n-1)+2*f(n-2)+1;

注意:用int是wa,要用__int64

代码:

#include<iostream>
#include<cstdio>
using namespace std;
const int N=200907;
struct node 
{
	__int64 matrix[4][4];
}ma,e;
node operator *(node x,node y)
{
	node temp;
	for(int i=1;i<=3;i++)
		for(int j=1;j<=3;j++)
		{
			temp.matrix[i][j]=0;
			for(int k=1;k<=3;k++)
				temp.matrix[i][j]+=(x.matrix[i][k]*y.matrix[k][j])%N;
			temp.matrix[i][j]%=N;
		}
		return  temp;
}
node operator ^(node x,int k)
{
	node ans=e,p=x;
	while(k)
	{
		if(k&1)
		{
			ans=ans*p;
		}
		k=k>>1;
		p=p*p;
	}
	return ans;
}
int main()
{
	__int64 n;
	memset(ma.matrix,0,sizeof(ma.matrix));
	memset(e.matrix,0,sizeof(e.matrix));
	ma.matrix[1][1]=ma.matrix[1][3]=ma.matrix[2][1]=ma.matrix[3][3]=1;
	ma.matrix[1][2]=2;
	for(int i=1;i<=3;i++)
		e.matrix[i][i]=1;
	while(scanf("%I64d",&n)!=EOF && n!=0)
	{
		if(n==1)
		{
			printf("1\n");
		}
		else if(n==2)
		{
			printf("2\n");
		}
		else
		{
			node t=ma^(n-2);
			int ans=(t.matrix[1][1]*2+t.matrix[1][2]*1+t.matrix[1][3])%N;
			printf("%I64d\n",ans);
		}
	}
	return 0;
}


你可能感兴趣的:(hdu 2842 Chinese Rings(矩阵乘法+递推))