#include <bits/stdc++.h> using namespace std; #define pil pair<int, long long> #define ll long long vector<pil> color[7007]; bool pos[7007][7007]; ll cost[7007][7007]; ll iterations(int m) { ll it = 0; for (int r = 1; r < m; r++) { // cout << r << ": " << m / gcd(r, m) << "\n"; it += (ll)(m / gcd(r, m)); } return it; } ll dp[7007]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); // pil it = {0, 0}; // for (int m = 1; m <= 7000; m++) // it = max(it, {iterations(m), m}); // cout << it.first << " " << it.second << "\n"; // return 0; int N, K, M; cin >> N >> K >> M; for (int i = 0; i < N; i++) { int k, m; ll c; cin >> k >> m >> c; color[k].push_back({m, c}); } pos[0][0] = true; int maks = 0; for (int i = 1; i <= K; i++) { // prefiks użytych kolorów int j = maks; maks = -1; while (j >= 0) { if (pos[i - 1][j]) { for (const auto& [m, c] : color[i]) { if (!pos[i][(j + m) % M]) { maks = max(maks, (j + m) % M); pos[i][(j + m) % M] = true; cost[i][(j + m) % M] = cost[i - 1][j] + c; } else { cost[i][(j + m) % M] = min(cost[i][(j + m) % M], cost[i - 1][j] + c); } } } j--; } } // cost[K] - składniki. Każdego używamy max M razy for (int i = 1; i < M; i++) { dp[i] = -1; } int max_mul = 0; for (int i = 1; i < M; i++) { // reszta if (pos[K][i]) { ll c = cost[K][i]; for (int j = i; j != 0; j = (j + i) % M) { if (dp[j] == -1) { dp[j] = c; max_mul = max(max_mul, j); } else { dp[j] = min(dp[j], c); } c += cost[K][i]; } } } int last = max_mul; for (int i = 1; i <= max_mul; i++) { if (dp[i] != -1) { for (int j = last; j >= 0; j--) { if (dp[j] != -1) { if (dp[(i + j) % M] == -1) { dp[(i + j) % M] = dp[i] + dp[j]; last = max(last, (i + j) % M); } else { dp[(i + j) % M] = min(dp[(i + j) % M], dp[i] + dp[j]); } } } } } for (int i = 0; i < M; i++) { cout << dp[i] << "\n"; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include <bits/stdc++.h> using namespace std; #define pil pair<int, long long> #define ll long long vector<pil> color[7007]; bool pos[7007][7007]; ll cost[7007][7007]; ll iterations(int m) { ll it = 0; for (int r = 1; r < m; r++) { // cout << r << ": " << m / gcd(r, m) << "\n"; it += (ll)(m / gcd(r, m)); } return it; } ll dp[7007]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); // pil it = {0, 0}; // for (int m = 1; m <= 7000; m++) // it = max(it, {iterations(m), m}); // cout << it.first << " " << it.second << "\n"; // return 0; int N, K, M; cin >> N >> K >> M; for (int i = 0; i < N; i++) { int k, m; ll c; cin >> k >> m >> c; color[k].push_back({m, c}); } pos[0][0] = true; int maks = 0; for (int i = 1; i <= K; i++) { // prefiks użytych kolorów int j = maks; maks = -1; while (j >= 0) { if (pos[i - 1][j]) { for (const auto& [m, c] : color[i]) { if (!pos[i][(j + m) % M]) { maks = max(maks, (j + m) % M); pos[i][(j + m) % M] = true; cost[i][(j + m) % M] = cost[i - 1][j] + c; } else { cost[i][(j + m) % M] = min(cost[i][(j + m) % M], cost[i - 1][j] + c); } } } j--; } } // cost[K] - składniki. Każdego używamy max M razy for (int i = 1; i < M; i++) { dp[i] = -1; } int max_mul = 0; for (int i = 1; i < M; i++) { // reszta if (pos[K][i]) { ll c = cost[K][i]; for (int j = i; j != 0; j = (j + i) % M) { if (dp[j] == -1) { dp[j] = c; max_mul = max(max_mul, j); } else { dp[j] = min(dp[j], c); } c += cost[K][i]; } } } int last = max_mul; for (int i = 1; i <= max_mul; i++) { if (dp[i] != -1) { for (int j = last; j >= 0; j--) { if (dp[j] != -1) { if (dp[(i + j) % M] == -1) { dp[(i + j) % M] = dp[i] + dp[j]; last = max(last, (i + j) % M); } else { dp[(i + j) % M] = min(dp[(i + j) % M], dp[i] + dp[j]); } } } } } for (int i = 0; i < M; i++) { cout << dp[i] << "\n"; } } |