luogu1096 Hanoi双塔问题【2007提高】(递推+高精)

来源:互联网 发布:新版淘宝直播在哪里看 编辑:程序博客网 时间:2024/04/28 02:11

首先手推f[1]=2,f[2]=6.我们发现把i*2个圆盘从一移到三上,其实就等价于把上面的(i-1)*2个圆盘从一移到二上,然后用两步把第一个柱子剩下的两个最大的移到第三个柱子上,再把(i-1)*2个圆盘从二移到三上。即f[i]=f[i-1]*2+2.然后试一下极限数据,发现会超long long,因此我们要用高精写。

#include <cstdio>#include <cstring>#define ll long longint const N=1000;int n;struct bigint{    int a[N],len;    bigint(){        memset(a,0,sizeof(a));len=0;    }    bigint operator*(int k){        bigint re;        for(int i=0;i<len;++i){             re.a[i]+=(a[i]<<1);            re.a[i+1]+=re.a[i]/10;            re.a[i]%=10;        }        re.len=len;        while(re.a[re.len]) re.len++;        return re;    }}ans;int main(){    scanf("%d",&n);    ans.a[0]=2;ans.len=1;    for(int i=2;i<=n;++i){        ans=ans*2;        ans.a[0]+=2;    }    for(int i=0;i<ans.len;++i){        ans.a[i+1]+=ans.a[i]/10;        ans.a[i]%=10;        while(ans.a[ans.len]) ans.len++;    }    for(int i=ans.len-1;i>=0;--i) printf("%d",ans.a[i]);    return 0;}
原创粉丝点击