NYISTME 1300 递推求值

来源:互联网 发布:三浦翔平人不好知乎 编辑:程序博客网 时间:2024/04/19 07:48



M - 递推求值
Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu
Submit Status Practice NYISTME 1300

Description

给你一个递推公式:

f(x)=a*f(x-2)+b*f(x-1)+c

并给你f(1),f(2)的值,请求出f(n)的值,由于f(n)的值可能过大,求出f(n)对1000007取模后的值。

注意:-1对3取模后等于2

Input

第一行是一个整数T,表示测试数据的组数(T<=10000) 随后每行有六个整数,分别表示f(1),f(2),a,b,c,n的值。 其中0<=f(1),f(2)<100,-100<=a,b,c<=100,1<=n<=100000000 (10^9)

Output

输出f(n)对1000007取模后的值

Sample Input

21 1 1 1 0 51 1 -1 -10 -100 3

Sample Output

5999896


#include<cstdio>long long aa[4][4],t[4][4],d[4][4];int main(){long long f1,f2,a,b,c,n,i,j,k,T;scanf("%lld",&T);while(T--){scanf("%lld%lld%lld%lld%lld%lld",&f1,&f2,&a,&b,&c,&n);aa[1][1]=b,aa[1][2]=a,aa[1][3]=c;aa[2][1]=1,aa[2][2]=0,aa[2][3]=0;aa[3][1]=0,aa[3][2]=0;aa[3][3]=1;d[1][1]=f2,d[2][1]=f1,d[3][1]=1;if(n==1)printf("%lld\n",f1);else if(n==2)printf("%lld\n",f2);else{n=n-2;while(n!=0){if(n%2==1){for( i=1;i<=3;i++){for( j=1;j<=1;j++){t[i][j]=0; for( k=1;k<=3;k++)t[i][j]+=aa[i][k]*d[k][j];}}for( i=1;i<=3;i++)for( j=1;j<=1;j++){if(t[i][j]<0)d[i][j]=(t[i][j]+1000007)%1000007;elsed[i][j]=t[i][j]%1000007;}}n/=2;{if(n==0)continue;for( i=1;i<=3;i++){for( j=1;j<=3;j++){t[i][j]=0; for( k=1;k<=3;k++)t[i][j]+=aa[i][k]*aa[k][j];}}for(int i=1;i<=3;i++)for(int j=1;j<=3;j++){if(t[i][j]<0)aa[i][j]=(t[i][j]+1000007)%1000007;//这儿要特别注意elseaa[i][j]=t[i][j]%1000007;}}  }printf("%lld\n",d[1][1]);}    }return 0;}


原创粉丝点击