这是Fib 数列的变种,简单分析一下:
(1 )首先得推出公式,即递推式 S(n)=S(n-1)+x*x*f(n-1)*f(n-1)+y*y*f(n-2)*f(n-2)+2*x*y*f(n-1)*f(n-2)
( 2 )公式已经推出来了,接下来就是构造举证
然后 矩阵快速模板:
现在在提醒自己以及大家要注意的几点
(1):要不断的取模,因为 题目给的数据范围接近int ,如果两个int 一相乘,就会溢出,所以边乘边取模,取模也得小心,不然就会由于失误各种wrong
( 2 ) :如果想把int 换位long long 很有可能会使时间增加一倍,会有可能TLE
附上代码:
#include <iostream>
#include <cstdio>
#include <stdio.h>
#define mod 10007
using namespace std;
struct matrix
{
int f[4][4];
};
matrix mul(matrix a,matrix b)
{
matrix c;
memset(c.f,0,sizeof(c.f));
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
for(int k=0;k<4;k++)
{
c.f[i][j]+=a.f[i][k]*b.f[k][j]%mod; //再次提醒自己 是乘不是加,之所以要mod 是因为两者相乘会溢出
c.f[i][j]%=mod;
}
return c;
}
matrix pow_mod(matrix a,int b)
{
matrix s;
memset(s.f,0,sizeof(s.f));
for(int i=0;i<4;i++)
s.f[i][i]=1;
while(b)
{
if(b&1)
{
s=mul(s,a);
}
b=b/2;
a=mul(a,a);
}
return s;
}
int main()
{
int n,x,y;
while(cin>>n>>x>>y)
{
x=x%mod;
y=y%mod;
matrix e;
e.f[0][0]=1; e.f[0][1]=x*x%mod; e.f[0][2]=y*y%mod; e.f[0][3]=2*x*y%mod;
e.f[1][0]=0; e.f[1][1]=x*x%mod; e.f[1][2]=y*y%mod; e.f[1][3]=2*x*y%mod;
e.f[2][0]=0; e.f[2][1]=1; e.f[2][2]=0; e.f[2][3]=0;
e.f[3][0]=0; e.f[3][1]=x%mod; e.f[3][2]=0; e.f[3][3]=y%mod;
e=pow_mod(e,n-1);
int sum=e.f[0][0]*2%mod;
for(int i=1;i<4;i++)
sum=sum+e.f[0][i]%mod;
printf("%d\n",sum%mod);
}
return 0;
}