P6280 [USACO20OPEN]Exercise G题解

· · 题解

#include <cstdio>

using namespace std;

int N, M, ans, cnt, f[10010][1300];
long long p[1300];
bool v[10010];

int main() {
    freopen("exercise.in", "r", stdin);
    freopen("exercise.out", "w", stdout);
    scanf("%d%d", &N, &M);
    for (int i = 2; i <= N; ++i)
        if (!v[i]) {
            p[++cnt] = i;
            for (int j = i; i * j <= N; ++j) v[i * j] = 1;
        }
    for (int i = 0; i <= cnt; ++i) f[0][i] = 1;
    for (int i = 1; i <= N; ++i) {
        for (int j = 1; j <= cnt; ++j) {
            f[i][j] = f[i][j - 1];
            for (long long k = p[j]; k <= i; k *= p[j])
                f[i][j] = (f[i][j] + f[i - k][j - 1] * k) % M;
        }
        ans = (ans + f[i][cnt]) % M;
    }
    printf("%d\n", (ans + 1) % M);
    return 0;
}