题意:​​http://acm.hdu.edu.cn/showproblem.php?pid=3306​

大意是这样的:f[0]=f[1]=1,f[n]=X*f[n-1]+Y*f[n-2].S[n]=f[0]^2+f[2]^2+--+f[n]^2.给定n,求出s[n]%10007。
要求出s[n]肯定不是逐个求出f[i]再平方相加求和。s[n]=s[n-1]+f[n]^2,f[n]^2=X^2*f[n-1]^2+Y^2*f[n-2]^2+2*X*Y*f[n-1]*f[n-2]。f[n]*f[n-1]=X*f[n-1]^2+Y*f[n-2]*f[n-1], s[1]=f[0]+f[1]=2。据此得到:

hdu 3306 Another kind of Fibonacci(矩阵连乘)_#include

 

进一步还能推出:

hdu 3306 Another kind of Fibonacci(矩阵连乘)_hdu_02

有了它之后问题基本解决了。还有一点,输入的x,y要及时的Mod。

#include <iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
const int mod=10007;
struct matrix{
LL m[4][4];
};
matrix A;
/*1 x^2 y^2 2*x*y
0 x^2 y^2 2*x*y
0 1 0 0
0 x 0 y*/
matrix I={
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1
};
matrix multi(matrix a,matrix b){
matrix c={0};
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
for(int k=0;k<4;k++){
c.m[i][j]+=a.m[i][k]*b.m[k][j]%mod;
}
c.m[i][j]%=mod;
}
}
return c;
}
matrix power(matrix a,int k){
matrix c=I;
while(k){
if(k&1){
c=multi(c,a);
k--;
}
k>>=1;
a=multi(a,a);
}
return c;
}
void initalA(LL x,LL y){
A={
1,(x%mod)*(x%mod),(y%mod)*(y%mod),2*(x%mod)*(y%mod),
0,(x%mod)*(x%mod),(y%mod)*(y%mod),2*(x%mod)*(y%mod),
0, 1, 0, 0,
0, x%mod, 0, y%mod
};
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
A.m[i][j]%=mod;
}
}
}
int main()
{
LL n,x,y;
while(cin>>n>>x>>y){
initalA(x,y);
matrix q=power(A,n-1);
LL ans=q.m[0][0]*2+q.m[0][1]+q.m[0][2]+q.m[0][3];
printf("%lld\n",ans%mod);
}
return 0;
}