3 条题解

  • 1
    @ 2025-11-23 22:11:45
    #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
      @ 2025-6-7 20:23:10
      
      #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
        @ 2023-5-19 21:14:04

        (缺失一部分)

        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
        标签
        递交数
        251
        已通过
        29
        上传者