根据题目写出取模运算,跟着公式做记忆化递归
View Code
1 //Accepted 392K 188MS G++ 908B 2 //Accepted 400K 172MS G++ 3 #include <stdio.h> 4 #include <math.h> 5 #include <string.h> 6 7 int a,b,c,d,e,f,g,h,i; 8 int ans[1001]; 9 int mod(int a,int b) 10 { 11 int r; 12 for(r=0;r<=b-1;r++) 13 if((a-r)%b==0) 14 return r; 15 } 16 int solve(int n)//顺推过去 17 { 18 for(int k = 3; k <= n; k++) 19 { 20 if(k % 2 == 1) 21 { 22 int t = d * ans[k-1] + e * ans[k-2] - f * ans[k-3]; 23 ans[k] = mod(t,g); 24 } 25 else 26 { 27 int t = f * ans[k-1] - d * ans[k-2] + e * ans[k-3]; 28 ans[k] = mod(t,h); 29 } 30 } 31 } 32 int solve1(int n)//递归思路 33 { 34 if(ans[n] > -1) return ans[n]; 35 else if(n % 2 == 1) 36 { 37 int t = d * solve1(n-1) + e * solve1(n-2) - f * solve1(n-3); 38 ans[n] = mod(t,g); 39 return ans[n]; 40 } 41 else 42 { 43 int t = f * solve1(n-1) - d * solve1(n-2) + e * solve1(n-3); 44 ans[n] = mod(t,h); 45 return ans[n]; 46 } 47 } 48 int main(void) 49 { 50 int t; 51 scanf("%d",&t); 52 while(t--) 53 { 54 memset(ans,-1,sizeof(ans)); 55 scanf("%d%d%d%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f,&g,&h,&i); 56 ans[0] = a; 57 ans[1] = b; 58 ans[2] = c; 59 solve1(i); 60 printf("%d\n",ans[i]); 61 } 62 return 0; 63 }