HDU3306 Another kind of Fibonacci

来源:互联网 发布:markdown软件 编辑:程序博客网 时间:2024/05/19 16:38
/*题目大意:定义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;}

0 0
原创粉丝点击