NYOJ 88 汉诺塔(一)
设金片数量为n时所需要的步骤为F(n),则易得递推式F(n) = 2F(n-1) + 1; 易推得F(n) = 2^n - 1;
但是一般的累乘容易超时,这题需要一个时间消耗为O(log n)的算法。
附ac代码:
#include <stdio.h> #define mod 1000000 long long power(int n){ //若n为偶数,则n个2相乘,等于前n/2个2相乘的平方 //若n为奇数,则n个2相乘,等于前n/2个2相乘的平方再乘以2 if(n == 1) return 2; long long t = power(n / 2) % mod; t = t * t % mod; if(n & 1) return t * 2 % mod; else return t; } int main(){ int t, n; scanf("%d", &t); while(t-- && scanf("%d", &n)){ printf("%d\n", power(n) - 1); } return 0; }
再附上一个超时的代码,耗时O(n);
#include <stdio.h> int main(){ int t, n; int temp; scanf("%d", &t); while(t-- && scanf("%d", &n)){ temp = 1; for(int i = 1; i <= n; ++i){ temp *= 2; temp %= 1000000; } printf("%d\n", temp - 1); } return 0; }