题意是定义一个新的斐波那契数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;
}