#include<bits/stdc++.h>
using namespace std;
#ifdef LOCAL
template <class T, class U> auto &operator<<(ostream &out, pair<T, U> a) { return out << "(" << a.first << ", " << a.second << ")"; }
template <class T, class = class enable_if<!is_same<T, string>(), class T::iterator>::type> auto &operator<<(ostream &out, T a) {
    out << "{";
    bool fi = 1;
    for(auto b : a) {
        if(fi) {out<<b; fi=0;}
        else out<<", "<<b;
    }
    return out << "}";
}
template <class T, class X, class Y> auto &operator<<(ostream &out, const priority_queue<T,X,Y>& a) {auto b = a; vector<T> v; while(!b.empty()) {v.push_back(b.top()); b.pop();} return out<<v; }
void dump(){
   cerr << "\e[39m"<<"\n";
}
template <class T, class... Ts> void dump(T a, Ts... x) {
   cerr << a << ", ";
   dump(x...);
}
#define debug(...) cerr << "\e[91m"<<__func__<<":"<<__LINE__<<"\t"<<"[" #__VA_ARGS__ "]: ", dump(__VA_ARGS__)
#else
#define debug(...) ;
#endif
template<class C> C reversed(C c) {reverse(c.begin(),c.end()); return c;}
#define rep(i, n) for(int i=0;i<(int)(n);i++)
#define all(X) (X).begin(), (X).end()
#define mp make_pair
#define st first
#define nd second
typedef long long ll;
typedef pair<int,int> pii;
const ll INF = 1e18;
struct Variant {
    int k, m, c;
    bool operator<(const Variant &o) const {
        return k < o.k;
    }
};
ostream& operator<<(ostream &out, const Variant &a) {
    return out << "(" << a.k << ", " << a.m << ", " << a.c << ")";
}
int add_mod(int a, int b, int m) {
    return a + b >= m ? a + b - m : a + b;
}
int32_t main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, k, m;
    cin >> n >> k >> m;
    vector<Variant> variants(n);
    for (auto &x : variants) cin >> x.k >> x.m >> x.c;
    sort(all(variants));
    // debug(variants);
    vector<vector<ll>> dp(2, vector<ll> (m, INF));
    int bit = 0, lastK = 0, ct = 0;
    dp[0][0] = 0;
    for (int i = 0;i < n;i++) {
        for (int j = 0;j < m;j++) {
            if (lastK != variants[i].k) {
                bit ^= 1;
                ct++;
                lastK = variants[i].k;
                dp[bit].assign(m, INF);
            }
            dp[bit][add_mod(j, variants[i].m, m)] = min(dp[bit][add_mod(j, variants[i].m, m)], dp[bit ^ 1][j] + variants[i].c);
        }
    }
    if (ct < k) {
        cout << "0\n";
        for (int i = 1;i < m;i++)
            cout << "-1\n";
        return 0;
    }
    vector<pair<ll, int>> nodes;
    vector<ll> res(m, INF);
    res[0] = 0;
    for (int i = 1;i < m;i++) {
        if (dp[bit][i] < INF) {
            nodes.push_back({dp[bit][i], i});
        }
    }
    sort(all(nodes));
    // debug(nodes);
    queue<int> q;
    q.push(0);
    while (!q.empty()) {
        int v = q.front();
        q.pop();
        for (auto &node : nodes) {
            int u = add_mod(v, node.second, m);
            ll val = res[v] + node.first;
            if (val < res[u]) {
                res[u] = val;
                q.push(u);
            }
        }
    }
    for (int i = 0;i < m;i++) {
        if (res[i] == INF) cout << "-1\n";
        else cout << res[i] << "\n";
    }
    return 0;
}
        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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128  | #include<bits/stdc++.h> using namespace std; #ifdef LOCAL template <class T, class U> auto &operator<<(ostream &out, pair<T, U> a) { return out << "(" << a.first << ", " << a.second << ")"; } template <class T, class = class enable_if<!is_same<T, string>(), class T::iterator>::type> auto &operator<<(ostream &out, T a) { out << "{"; bool fi = 1; for(auto b : a) { if(fi) {out<<b; fi=0;} else out<<", "<<b; } return out << "}"; } template <class T, class X, class Y> auto &operator<<(ostream &out, const priority_queue<T,X,Y>& a) {auto b = a; vector<T> v; while(!b.empty()) {v.push_back(b.top()); b.pop();} return out<<v; } void dump(){ cerr << "\e[39m"<<"\n"; } template <class T, class... Ts> void dump(T a, Ts... x) { cerr << a << ", "; dump(x...); } #define debug(...) cerr << "\e[91m"<<__func__<<":"<<__LINE__<<"\t"<<"[" #__VA_ARGS__ "]: ", dump(__VA_ARGS__) #else #define debug(...) ; #endif template<class C> C reversed(C c) {reverse(c.begin(),c.end()); return c;} #define rep(i, n) for(int i=0;i<(int)(n);i++) #define all(X) (X).begin(), (X).end() #define mp make_pair #define st first #define nd second typedef long long ll; typedef pair<int,int> pii; const ll INF = 1e18; struct Variant { int k, m, c; bool operator<(const Variant &o) const { return k < o.k; } }; ostream& operator<<(ostream &out, const Variant &a) { return out << "(" << a.k << ", " << a.m << ", " << a.c << ")"; } int add_mod(int a, int b, int m) { return a + b >= m ? a + b - m : a + b; } int32_t main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n, k, m; cin >> n >> k >> m; vector<Variant> variants(n); for (auto &x : variants) cin >> x.k >> x.m >> x.c; sort(all(variants)); // debug(variants); vector<vector<ll>> dp(2, vector<ll> (m, INF)); int bit = 0, lastK = 0, ct = 0; dp[0][0] = 0; for (int i = 0;i < n;i++) { for (int j = 0;j < m;j++) { if (lastK != variants[i].k) { bit ^= 1; ct++; lastK = variants[i].k; dp[bit].assign(m, INF); } dp[bit][add_mod(j, variants[i].m, m)] = min(dp[bit][add_mod(j, variants[i].m, m)], dp[bit ^ 1][j] + variants[i].c); } } if (ct < k) { cout << "0\n"; for (int i = 1;i < m;i++) cout << "-1\n"; return 0; } vector<pair<ll, int>> nodes; vector<ll> res(m, INF); res[0] = 0; for (int i = 1;i < m;i++) { if (dp[bit][i] < INF) { nodes.push_back({dp[bit][i], i}); } } sort(all(nodes)); // debug(nodes); queue<int> q; q.push(0); while (!q.empty()) { int v = q.front(); q.pop(); for (auto &node : nodes) { int u = add_mod(v, node.second, m); ll val = res[v] + node.first; if (val < res[u]) { res[u] = val; q.push(u); } } } for (int i = 0;i < m;i++) { if (res[i] == INF) cout << "-1\n"; else cout << res[i] << "\n"; } return 0; }  | 
            
        
                    English