hdu 3306 Another kind of Fibonacci
这题属于矩阵构造,有
a(n)=x*a(n-1)+y*a(n-2);
s(n)=s(n-1)+a(n)^2;
联立可得到相关矩阵,再用矩阵2分快速幂就可得到结果了……
#include<iostream>
#include<stdio.h>
using namespace std;
typedef __int64 int64;
long x,y,n;
const int mod=10007;
struct matrix
{
int64 a[4][4];
};
matrix e;
matrix mul(matrix m,matrix n)
{
matrix ans;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
ans.a[i][j]=0;
for(int k=0;k<4;k++)
ans.a[i][j]+=(m.a[i][k]*n.a[k][j])%mod;
ans.a[i][j]%=mod;
}
return ans;
}
matrix fun1(matrix m,long n)
{
matrix ans;
ans=e;
while(n)
{
if(n&1)
ans=mul(m,ans);
n>>=1;
m=mul(m,m);
}
return ans;
}
int main()
{
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
e.a[i][j]=(i==j);
while(scanf("%d%d%d",&n,&x,&y)!=EOF)
{
matrix p,ans;
int64 sum=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
p.a[i][j]=0;
p.a[0][0]=p.a[0][1]=1;p.a[1][1]=((x%mod)*(x%mod))%mod;p.a[1][2]=((y%mod)*(y%mod))%mod;p.a[1][3]=2*(x%mod)*(y%mod);
p.a[2][1]=1;p.a[3][1]=x%mod;p.a[3][3]=y%mod;
ans=fun1(p,n);
sum=ans.a[0][0]+ans.a[0][1]+ans.a[0][2]+ans.a[0][3];
printf("%I64d\n",sum%mod);
}
return 0;
}

浙公网安备 33010602011771号