//GRT_2018
#include <bits/stdc++.h>
#define PB push_back
#define ST first
#define ND second
#define all(x) x.begin(), x.end()
//mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
using namespace std;
using ll = long long;
using pi = pair<int,int>;
using vi = vector<int>;
const int nax = 7000 + 10;
const ll INF = 1e18;
int n, k, m;
vector<pi>items[nax];
ll dp[nax][2];
ll DP[nax][2];
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> k >> m;
for (int col, mass, cost, i = 0; i < n; ++i) {
cin >> col >> mass >> cost;
items[col].emplace_back(mass, cost);
}
for (int i = 0; i < m; ++i) dp[i][0] = INF;
dp[0][0] = 0;
for (int col = 1; col <= k; ++col) {
for (int i = 0; i < m; ++i) {
dp[i][col%2] = INF;
}
for (auto [mass, cost] : items[col]) {
for (int i = 0; i < m; ++i) {
dp[(i + mass) % m][col%2] = min(dp[(i + mass) % m][col%2], dp[i][1-(col%2)] + cost);
}
}
}
DP[0][0] = 0;
for (int i = 1; i < m; ++i) DP[i][0] = INF;
for (int r = 1; r < m; ++r) {
for (int i = 0; i < m; ++i) DP[i][r%2] = INF;
int g = gcd(r, m);
for (int r2 = 0; r2 < g; ++r2) {
ll best = INF;
ll cost = 0;
for (int rep = 0; rep < m / g; ++rep) {
best = min(best, DP[(r2 - (ll)(r-m) * rep) % m][1-(r%2)] + cost);
cost += dp[r][k % 2];
if (cost > INF) break;
}
for (int rep = 0, i = r2; rep < m / g; ++rep, i = (i + r) % m) {
best = min(best, DP[i][1 - (r%2)]);
DP[i][r%2] = min(DP[i][r%2], best);
best += dp[r][k%2];
}
}
}
for (int i = 0; i < m; ++i) {
cout << (DP[i][(m-1)%2] == INF ? -1 : DP[i][(m-1)%2]) << "\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 | //GRT_2018 #include <bits/stdc++.h> #define PB push_back #define ST first #define ND second #define all(x) x.begin(), x.end() //mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); using namespace std; using ll = long long; using pi = pair<int,int>; using vi = vector<int>; const int nax = 7000 + 10; const ll INF = 1e18; int n, k, m; vector<pi>items[nax]; ll dp[nax][2]; ll DP[nax][2]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k >> m; for (int col, mass, cost, i = 0; i < n; ++i) { cin >> col >> mass >> cost; items[col].emplace_back(mass, cost); } for (int i = 0; i < m; ++i) dp[i][0] = INF; dp[0][0] = 0; for (int col = 1; col <= k; ++col) { for (int i = 0; i < m; ++i) { dp[i][col%2] = INF; } for (auto [mass, cost] : items[col]) { for (int i = 0; i < m; ++i) { dp[(i + mass) % m][col%2] = min(dp[(i + mass) % m][col%2], dp[i][1-(col%2)] + cost); } } } DP[0][0] = 0; for (int i = 1; i < m; ++i) DP[i][0] = INF; for (int r = 1; r < m; ++r) { for (int i = 0; i < m; ++i) DP[i][r%2] = INF; int g = gcd(r, m); for (int r2 = 0; r2 < g; ++r2) { ll best = INF; ll cost = 0; for (int rep = 0; rep < m / g; ++rep) { best = min(best, DP[(r2 - (ll)(r-m) * rep) % m][1-(r%2)] + cost); cost += dp[r][k % 2]; if (cost > INF) break; } for (int rep = 0, i = r2; rep < m / g; ++rep, i = (i + r) % m) { best = min(best, DP[i][1 - (r%2)]); DP[i][r%2] = min(DP[i][r%2], best); best += dp[r][k%2]; } } } for (int i = 0; i < m; ++i) { cout << (DP[i][(m-1)%2] == INF ? -1 : DP[i][(m-1)%2]) << "\n"; } } |
English