HDU3306Another kind of Fibonacci

题意是定义一个新的斐波那契数F[n]=x*F[n-1]+y*F[n-2],现在给你x和y让你求前n项的平方和S[n]=F[0]^2+....+F[n]^2

怎么求呢?我们将F[n]和S[n]列出来

F[n]=x*F[n-1]+y*F[n-2]

S[n]=S[n-1]+F[n]^2

联立一下发现    S[n]=S[n-1]+(x*F[n-1]+y*F[n-2])^2=S[n-1]+x^2*F[n-1]^2+y^2*F[n-2]^2+2*x*y*F[n-1]*F[n-2]

然后我们发现里面带平方了emm,怎么办呢?那就平方转移得了呗,构造完矩阵,将上面各项的系数填进去,然后转移就好了

代码

//By AcerMo 
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
const int mod=10007;
int p,q,n;
struct mtix
{
	int x[5][5];
	mtix(){memset(x,0,sizeof(x));}
}f;
mtix mul(mtix a,mtix b)
{
	mtix c;
	for (int i=1;i<=4;i++)
	for (int j=1;j<=4;j++)
	for (int k=1;k<=4;k++)
	c.x[i][j]=(lli)((lli)c.x[i][j]+(lli)a.x[i][k]*b.x[k][j])%mod;
	return c;
}
void mpow(int y)
{
	int b[5]={0,2,1,1,1};
	mtix ans;lli sum=0;
	for (int i=1;i<=4;i++) ans.x[i][i]=1;
	for (;y;f=mul(f,f),y>>=1)
		if (y&1) ans=mul(ans,f);
	for (int i=1;i<=4;i++)
		sum=(sum+b[i]*ans.x[1][i])%mod;
	cout<<sum%mod<<endl;
	return ;
}
void fir(lli x,lli y)
{
	f.x[1][1]=1;f.x[3][2]=1;
	f.x[1][2]=(x*x)%mod;
	f.x[1][3]=(y*y)%mod;
	f.x[2][2]=(x*x)%mod;
	f.x[2][3]=(y*y)%mod;
	f.x[2][4]=(2*x*y)%mod;
	f.x[1][4]=(2*x*y)%mod;
	f.x[4][2]=x;f.x[4][4]=y;
	f.x[2][1]=0;f.x[3][1]=0;f.x[3][3]=0;
	f.x[3][4]=0;f.x[4][1]=0;f.x[4][3]=0;
	return ;
}
int main()
{
	while (cin>>n>>p>>q)
		fir(p,q),mpow(n-1);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/acerandaker/article/details/81138110