3 条题解
-
1
#include<bits/stdc++.h> #define N 250//2000位够了,250*8 using namespace std; int f[3][N+10],g; int n; int main() { f[0][N]=1;f[1][N]=1;scanf("%d",&n);if(!n){puts("0");return 0;}//0要特判 for(int i=2;i<=n;i++) for(int j=N;j>0;j--) { f[i%3][j]=(f[(i+1)%3][j]+f[(i+2)%3][j]+g)%100000000; g=(f[(i+1)%3][j]+f[(i+2)%3][j]+g)/100000000;//8个0,别漏了 } int j=1; while(!f[n%3][j]&&j<N) j++;//处理前导0 for(int i=j;i<=N;i++) { if(i!=j){//一定别漏了前面这句 if(f[n%3][i]<1e7) putchar(48); if(f[n%3][i]<1e6) putchar(48); if(f[n%3][i]<1e5) putchar(48); if(f[n%3][i]<1e4) putchar(48); if(f[n%3][i]<1e3) putchar(48); if(f[n%3][i]<1e2) putchar(48); if(f[n%3][i]<1e1) putchar(48);}//补足前导0 printf("%d",f[n%3][i]);//输出 } } -
1
#include <iostream> #include <vector> #include <string> #include <algorithm> // 添加这行 using namespace std; vector<string> dp(6001); string addStrings(string num1, string num2) { string res; int i = num1.size()-1, j = num2.size()-1; int carry = 0; while(i >= 0 || j >= 0 || carry) { int n1 = i >= 0 ? num1[i--]-'0' : 0; int n2 = j >= 0 ? num2[j--]-'0' : 0; int sum = n1 + n2 + carry; res.push_back(sum%10 + '0'); carry = sum/10; } reverse(res.begin(), res.end()); return res; } void precompute() { dp[0] = "1"; dp[1] = "1"; for(int i = 2; i <= 6000; i++) { dp[i] = addStrings(dp[i-1], dp[i-2]); } } int main() { precompute(); int n; cin >> n; cout << dp[n] << endl; return 0; } -
1
(缺失一部分)
int main(){ IOS; cin>>n; if(n<3){ //特殊判断 } a[1]=1,b[1]=2; for(int i=3;i<=n;i++){ for(int j=1;j<=len;j++)c[j]=a[j]+b[j]; for(int j=1;j<=len;j++){ if(c[j]>9){ //处理进位 if(j+1>len)len++; } } for(int j=1;j<=len;j++)a[j]=b[j],b[j]=c[j]; } for(int i=len;i>=1;i--)//输出部分 return 0; }
- 1
信息
- ID
- 1227
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 261
- 已通过
- 31
- 上传者