博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3047 Fibonacci
阅读量:4661 次
发布时间:2019-06-09

本文共 3426 字,大约阅读时间需要 11 分钟。

DEBUG很辛苦,且行, 且珍惜

原代码:

ans[0][0] = (ans[0][0]  * a[flag][0][0] + ans[0][1]  * a[flag][1][0]) % 10000;            ans[0][1] = (ans[0][0]  * a[flag][0][1] + ans[0][1]  * a[flag][1][1]) % 10000;            ans[1][0] = (ans[1][0] * a[flag][0][0] + ans[1][1]  * a[flag][1][0]) % 10000;            ans[1][1] = (ans[1][0] * a[flag][0][1] + ans[1][1]  * a[flag][1][1]) % 10000;

问题在于:修改后ans[][]的值再次调用,就不是原来的值了,会导致程序出错

QAQ

改进后:

ans[0][0] = (temp_1 * a[flag][0][0] + temp_2 * a[flag][1][0]) % 10000;            ans[0][1] = (temp_1 * a[flag][0][1] + temp_2 * a[flag][1][1]) % 10000;            ans[1][0] = (temp_3 * a[flag][0][0] + temp_4 * a[flag][1][0]) % 10000;            ans[1][1] = (temp_3 * a[flag][0][1] + temp_4 * a[flag][1][1]) % 10000;

  

算法思路:利用快速幂,实现大数范围的快速计算,不会超时

1 #include 
2 #include
3 #include
4 #include
5 #include
6 7 using namespace std; 8 const int INF = 0x3f3f3f3f; 9 10 int a[40][2][2];11 void test_print(){12 for(int i = 0; i < 40; ++i){13 printf("i = %d\n",i);14 printf("%d\n\n",a[i][0][1]);15 }16 }17 int main(){18 int i, j, k;19 int n;20 a[0][0][0] = 1;21 a[0][0][1] = 1;22 a[0][1][0] = 1;23 a[0][1][1] = 0;// n = 124 25 for(i = 1; i < 40; ++i){26 a[i][0][0] = (a[i-1][0][0] * a[i-1][0][0] + a[i-1][0][1] * a[i-1][1][0]) % 10000;27 a[i][0][1] = (a[i-1][0][0] * a[i-1][0][1] + a[i-1][0][1] * a[i-1][1][1]) % 10000;28 a[i][1][0] = (a[i-1][1][0] * a[i-1][0][0] + a[i-1][1][1] * a[i-1][1][0]) % 10000;29 a[i][1][1] = (a[i-1][1][0] * a[i-1][0][1] + a[i-1][1][1] * a[i-1][1][1]) % 10000;30 }31 // test_print();32 while(EOF != scanf("%d",&n)){33 if(-1 == n) break;34 else if(0 == n){35 printf("0\n");36 continue;37 }38 int count = 0;39 int flag;40 int ans[2][2];41 int array[65];42 int flag_t = 0;43 bool init_ok = false;44 memset(array, 0, sizeof(array));45 while(n){46 if(n % 2 == 0){47 n /= 2;48 array[flag_t] = 0;49 } else{50 n = (n - 1) / 2;51 array[flag_t] = 1;52 }53 ++flag_t;54 }55 //for(i = 0; i < flag_t / 2; ++i) swap(array[i], array[flag_t - i -1 ]);56 for(i = 0; i < flag_t; ++i){57 if(!array[i]) continue;58 int flag = i;59 if(!init_ok){60 ans[0][0] = a[i][0][0];61 ans[0][1] = a[i][0][1];62 ans[1][0] = a[i][1][0];63 ans[1][1] = a[i][1][1];64 init_ok = true;65 continue;66 }67 int temp_1 = ans[0][0];68 int temp_2 = ans[0][1];69 int temp_3 = ans[1][0];70 int temp_4 = ans[1][1];71 ans[0][0] = (temp_1 * a[flag][0][0] + temp_2 * a[flag][1][0]) % 10000;72 ans[0][1] = (temp_1 * a[flag][0][1] + temp_2 * a[flag][1][1]) % 10000;73 ans[1][0] = (temp_3 * a[flag][0][0] + temp_4 * a[flag][1][0]) % 10000;74 ans[1][1] = (temp_3 * a[flag][0][1] + temp_4 * a[flag][1][1]) % 10000;75 }76 printf("%d\n",ans[0][1]);77 }78 return 0;79 }

 

转载于:https://www.cnblogs.com/wushuaiyi/p/3873324.html

你可能感兴趣的文章