按题意直接模拟即可。

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;
}