2 条题解

  • 0
    @ 2026-1-4 18:30:57

    按题意直接模拟即可。

    AC code:

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        vector<int> primes;
        bool is_prime[301] = {false};
        for (int i = 2; i <= 300; ++i) {
            if (!is_prime[i]) {
                if (i != 2) {
                    primes.push_back(i);
                }
                for (int j = i * i; j <= 300; j += i) {
                    is_prime[j] = true;
                }
            }
        }
        int n, m;
        cin >> n >> m;
        vector<vector<int> > result;
        vector<int> path;
        function<void(int, int, int)> backtrack = [&](int k, int sum, int start) {
            if (k == n) {
                if (sum == m) {
                    result.push_back(path);
                }
                return;
            }
            if (start + (n - k) > primes.size()) {
                return;
            }
            int remain = n - k;
            int min_remain = 0;
            for (int i = 0; i < remain; ++i) {
                if (start + i >= primes.size()) {
                    min_remain = INT_MAX;
                    break;
                }
                min_remain += primes[start + i];
            }
            if (sum + min_remain > m) {
                return;
            }
            if (sum > m) {
                return;
            }
            for (int i = start; i < primes.size(); ++i) {
                int current = primes[i];
                if (path.empty() || current > path.back()) {
                    path.push_back(current);
                    backtrack(k + 1, sum + current, i + 1);
                    path.pop_back();
                }
            }
        };
        backtrack(0, 0, 0);
        if (result.empty()) {
            cout << "No Answer." << endl;
        } else {
            cout << result.size() << endl;
            for (const auto& combo : result) {
                for (size_t i = 0; i < combo.size(); ++i) {
                    if (i > 0) {
                        cout << " ";
                    }
                    cout << combo[i];
                }
                cout << endl;
            }
        }
        return 0;
    }
    
    • 0
      @ 2025-9-4 21:59:20

      直接爆搜即可。

      #include <bits/stdc++.h>
      using namespace std;
      const int p[64]={3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293};
      int o[22],n,m;
      void output()
      {
          for(int i=n;i>=1;i--)
              cout<<o[i]<<' ';
          cout<<endl;
      }
      int dfs1(int h,int l,int s)
      {
          if(s<0) return 0;
          if(l==0)
          {
              if(s==0) return 1;
              return 0;
          }
          int ans=0;
          for(int i=h+1;i<=60;i++)
              ans+=dfs1(i,l-1,s-p[i]);
          return ans;
      }
      void dfs2(int h,int l,int s)
      {
          if(s<0) return;
          if(l==0)
          {
              if(s==0) output();
              return;
          }
          for(int i=h+1;i<=60;i++)
          {
              o[l]=p[i];
              dfs2(i,l-1,s-p[i]);
          }
      }
      int main()
      {
          cin>>n>>m;
          int f=dfs1(-1,n,m);
          if(!f)
          {
              puts("No Answer.");
              return 0;
          }
          cout<<f<<endl;
          dfs2(-1,n,m);
          return 0;
      }
      
      • 1

      信息

      ID
      26
      时间
      1000ms
      内存
      256MiB
      难度
      2
      标签
      递交数
      8
      已通过
      3
      上传者