7 条题解

  • 1
    @ 2025-6-28 9:22:24

    用递归做是最简单的

    #include <bits/stdc++.h>
    using namespace std;
    int dg(int n)
    {
        if(n==1||n==2)
        {
            return 1;//如果是1/2,直接return1
        }
        else
        {
            return dg(n-1)+dg(n-2);//否则继续递归
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);cout.tie(0);
        int n,m;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>m;
            cout<<dg(m)<<'\n';
        }
        return 0;
    }
    
    • 1
      @ 2023-10-12 18:52:22
      #include<iostream>
      using namespace std;
      int a(int n){
      	int a1=1,a2=1,a3;
          for(int i=0;i<n-2;i++){
          a3=a1+a2;
          a1=a2;
          a2=a3;}
          return a3;
      }
      int main(){
          int m;
          cin>>m;
          int n;
          for(int i=0;i<m;i++){
              cin>>n;
              if(n==1||n==2){
              	cout<<"1"<<endl;
      		}
              else{
      		n=a(n);
              cout<<n<<endl;}
          }
      }
      
      • 1
        @ 2023-9-24 14:09:41

        #include<stdio.h> int main() {int m,n,i,s1,s2; scanf("%d",&m); while(m--) {scanf("%d",&n); for(i=3,s1=s2=1; i<=n;i++) {s1=s1+s2; s2=s1-s2; } printf("%d\n",s1); } return 0; }

        • 0
          @ 2026-3-24 17:24:38

          空间换时间

          #include <stdio.h>
          
          int main() {
              int fibo[20] = {1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765};
              int n, i;
              scanf("%d", &n);
              while(n--){
                  scanf("%d", &i);
                  printf("%d\n", fibo[i-1]);
              }
          }
          
          • 0
            @ 2025-9-27 13:17:22
            #include<stdio.h>
             int main() 
             {int m,n,i,s1,s2; 
            scanf("%d",&m);//代表测试用例的数量
             while(m--)//当m小于等于零时停止循环
              {scanf("%d",&n); //输入用例
              for(i=3,s1=s2=1; i<=n;i++) //n小于三时直接输出s1=1
              {s1=s1+s2; s2=s1-s2; }//当n大于等于3时开始循环不断为s1,s2赋值
               printf("%d\n",s1); }//输出最后两项s1s2相加的结果s1
             return 0; }//得解
            
            • 0
              @ 2025-8-20 15:45:36

              来个矩阵快速幂(虽然通常是需要取模的时候再用😋o(logn))

              #include <bits/stdc++.h>
              using namespace std;
              #define ll long long
              typedef vector<vector<ll>> mat;
              
              mat operator*(const mat &a, const mat &b) {
                  mat c(2, vector<ll>(2));
                  for (int i = 0; i < 2; ++i) {
                      for (int j = 0; j < 2; ++j) {
                          for (int k = 0; k < 2; ++k) {
                              c[i][j] += a[i][k] * b[k][j];
                          }
                      }
                  }
                  return c;
              }
              
              
              mat operator^(mat a, ll b) {
                  mat res = {{1, 0}, {0, 1}};
                  while (b) {
                      if (b & 1) res = res * a;
                      a = a * a;
                      b >>= 1;
                  }
                  return res;
              }
              
              
              
              void solve() {
                  ll n;
                  cin >> n;
                  if (n == 1) {
                      cout << 1 << '\n';
                      return;
                  }
                  mat trans = {{1, 1}, {1, 0}};
                  mat power = trans ^ (n - 2);
                  mat init = {{1, 0}, {1, 0}};
                  mat res = power * init;
                  cout << res[0][0] << '\n';
              }
              
              
              
              int main() {
                  int t;
                  cin >> t;
                  while (t--) {
                      solve();
                  }
                  return 0;
              }
              
              • 0
                @ 2023-9-16 23:39:15
                #include<stdio.h>
                int main()
                {
                    int m;
                    scanf("%d",&m);
                    int a[25]={0};
                    a[1]=1;
                    a[2]=1;
                    int n;    
                    for(int i=3;i<25;i++){
                            a[i]=a[i-1]+a[i-2];
                    }
                    for(int j=1;j<=m;j++){
                        scanf("%d",&n);
                        printf("%d\n",a[n]);
                    }
                    return 0;
                }
                
                • 1

                信息

                ID
                123
                时间
                3000ms
                内存
                128MiB
                难度
                4
                标签
                (无)
                递交数
                1234
                已通过
                542
                上传者