注意范围,来个简陋的高精度就行了。
#include<bits/stdc++.h> using namespace std; long long f[310][10010]; long long cnt[310]; inline void add(int x,int y,int z) { int m=max(cnt[y],cnt[z]); for(int i=1;i<=m;++i) { f[x][i]+=f[y][i]+f[z][i]; if(f[x][i]>9) { f[x][i+1]+=f[x][i]/10; f[x][i]%=10; } } if(f[x][m+1]) cnt[x]=m+1; else cnt[x]=m; } int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); //reopen(".in","r",stdin); //freopen(".out","w",stdout); int n; cin>>n; //if(n==0) {cout<<0;return 0;} n=n+1; f[1][1]=f[2][1]=cnt[1]=cnt[2]=1; for(int i=3;i<=n;++i) add(i,i-1,i-2); for(int i=cnt[n];i;--i) { cout<<f[n][i]; } cout<<endl; return 0; } /************************************************************** Problem: 4562 User: contest21_42 Language: C++ Result: 正确 Time:3 ms Memory:26424 kb ****************************************************************/