hdu1995 汉诺塔V

来源:互联网 发布:c++界面编程 编辑:程序博客网 时间:2024/05/17 08:25

    可以直接把前K-1个罗盘全部忽略了,因为移动前K-1个罗盘不会影响第K个。

    也就是相当于只移动剩下的n-k-1个罗盘,当只移动第k个罗盘时,f(k)=1;当要哟东第k个和第k+1个时,就必须先把第k个移移到另一个罗盘,再把k+1移到另外一个,最后把第k个移到k+1上面,因此f(k+1)=f(k)+f(k),以此类推f(k+x)=2*f(k+x-1)。

得到公式:ans=2^(n-k)


AC代码:

#include<cstdio>typedef long long LL;const int maxn=65;LL w[maxn];void Init(){w[0]=1;for(int i=1;i<=60;++i) w[i]=w[i-1]*2;}int main(){Init();int T,n,m;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);printf("%lld\n",w[n-m]);}return 0;}

如有不当之处欢迎指出!


0 0