/*
题目大意:定义f[n]=x*f[n-1]+y*f[n-2];s[n]=f[0]^2+f[1]^2+f[n]^2;
输入n,x,y,输出mod10007后的s[n];
*/
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int mod=10007;
typedef struct
{
long long m[4][4];
}matrix;
matrix I={1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1};
matrix mul(matrix a,matrix b)
{
int i,j,k;
matrix c;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
c.m[i][j]=0;
for(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 quick_mod(int n,int x,int y)
{
/*matrix P={1,x*x,y*y,2*x*y,
0,x*x,y*y,2*x*y,
0,1,0,0,
0,x,0,y}; 因为输入的x和y可能很大,所以这时候直接用x*x就溢出了,运行mul函数时总WA,这地方载了N次了。。*/
matrix P={1,((x%mod)*(x%mod))%mod,((y%mod)*(y%mod))%mod,2*((x%mod)*(y%mod))%mod,
0,((x%mod)*(x%mod))%mod,((y%mod)*(y%mod))%mod,2*((x%mod)*(y%mod))%mod,
0,1,0,0,
0,x%mod,0,y%mod};
matrix a=P,b=I;
while(n>0)
{
if(n&1)
b=mul(b,a);
n=n>>1;
a=mul(a,a);
}
return b;
}
int main()
{
int n,x,y;
while(scanf("%d%d%d",&n,&x,&y)!=-1)
{
matrix temp=quick_mod(n-1,x,y);
printf("%d\n",(temp.m[0][0]*2+temp.m[0][1]+temp.m[0][2]+temp.m[0][3])%mod);
}
return 0;
}
HDU3306 Another kind of Fibonacci
最新推荐文章于 2019-08-08 19:33:00 发布