【解题报告】洛谷P1096 Hanoi双塔问题
题目链接
https://www.luogu.com.cn/problem/P1096
思路
一个普通的汉诺塔的变形问题
策略和普通的一样
上面的 (n−1)×2 层先移到B上然后把最后两个移动到C上,最后把B上面的移动到C上
设 f[i] 表示把 2i 层完成的步骤
然后就有 f[i]=2×f[i−1]+2 边界是 f[1]=2
然后发现数据最后比较大,“数据之大,long long装不下”
然后我们加一个高精度就完了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <string> using namespace std; const int maxn=2500; char s[maxn]; struct gaojing{ int n,z[maxn]; gaojing() { n=1; memset(z,0,sizeof(z)); } void init() { scanf("%s",s+1); int len=strlen(s+1); reverse(s+1,s+len+1); n=len; for(int i=1;i<=n;i++) z[i]=s[i]-'0'; } void print() { for(int i=n;i>=1;i--) cout<<z[i]; } }; gaojing operator+(const gaojing &a,const gaojing &b) { gaojing c; c.n=max(a.n,b.n); for(int i=1;i<=c.n;i++) c.z[i]=a.z[i]+b.z[i]; for(int i=1;i<=c.n;i++) { c.z[i+1]+=c.z[i]/10; c.z[i]=c.z[i]%10; } if(c.z[c.n+1]!=0) c.n++; return c; } gaojing operator*(const gaojing &a,const gaojing &b) { gaojing c; c.n=a.n+b.n; for(int i=1;i<=a.n;i++) { for(int j=1;j<=b.n;j++) c.z[i+j-1]+=a.z[i]*b.z[j]; } for(int i=1;i<=c.n;i++) { c.z[i+1]+=c.z[i]/10; c.z[i]=c.z[i]%10; } while(c.n!=1&&c.z[c.n]==0) c.n--; return c; } int n; gaojing f[205]; int main() { cin>>n; gaojing two; two.n=1; two.z[1]=2; f[1]=two; for(int i=2;i<=n;i++) f[i]=two*f[i-1]+two; f[n].print(); return 0; }
|