#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll N = 7000 + 5, Inf = 0x3f3f3f3f3f3f3f3f; inline ll gcd(ll x, ll y){ if(y) return gcd(y, x % y); else return x; } inline void checkmin(ll &x, ll y){ if(y < x) x = y; } class info{ public: ll v, w; inline info() {} inline info(ll v0, ll w0){ v = v0, w = w0; } }; ll n = 0, m = 0, k = 0, f[N][N] = {}, g[N] = {}; vector<info> bag[N] = {}; inline ll calc(ll x, ll y){ if(x + y < m) return x + y; else return x + y - m; } int main(){ scanf("%lld %lld %lld", &n, &k, &m); for(ll i = 0, c = 0, v = 0, w = 0 ; i < n ; i ++){ scanf("%lld %lld %lld", &c, &v, &w); c --, v %= m; bag[c].push_back(info(v, w)); } memset(f, 0x3f, sizeof(f)); f[0][0] = 0; for(ll c = 0 ; c < k ; c ++) for(auto node : bag[c]){ ll v = node.v, w = node.w; for(ll x = 0 ; x < m ; x ++) checkmin(f[c + 1][calc(x, v)], f[c][x] + w); } memset(g, 0x3f, sizeof(g)); g[0] = 0; for(ll v = 1 ; v < m ; v ++){ ll w = f[k][v]; for(ll i = 0, h = gcd(v, m) ; i < h ; i ++) for(ll j = i, t = 0 ; t < 2 * (m / h) ; j = calc(j, v), t ++) checkmin(g[calc(j, v)], g[j] + w); } for(ll i = 0 ; i < m ; i ++){ if(g[i] < Inf) printf("%lld\n", g[i]); else printf("-1\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 | #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll N = 7000 + 5, Inf = 0x3f3f3f3f3f3f3f3f; inline ll gcd(ll x, ll y){ if(y) return gcd(y, x % y); else return x; } inline void checkmin(ll &x, ll y){ if(y < x) x = y; } class info{ public: ll v, w; inline info() {} inline info(ll v0, ll w0){ v = v0, w = w0; } }; ll n = 0, m = 0, k = 0, f[N][N] = {}, g[N] = {}; vector<info> bag[N] = {}; inline ll calc(ll x, ll y){ if(x + y < m) return x + y; else return x + y - m; } int main(){ scanf("%lld %lld %lld", &n, &k, &m); for(ll i = 0, c = 0, v = 0, w = 0 ; i < n ; i ++){ scanf("%lld %lld %lld", &c, &v, &w); c --, v %= m; bag[c].push_back(info(v, w)); } memset(f, 0x3f, sizeof(f)); f[0][0] = 0; for(ll c = 0 ; c < k ; c ++) for(auto node : bag[c]){ ll v = node.v, w = node.w; for(ll x = 0 ; x < m ; x ++) checkmin(f[c + 1][calc(x, v)], f[c][x] + w); } memset(g, 0x3f, sizeof(g)); g[0] = 0; for(ll v = 1 ; v < m ; v ++){ ll w = f[k][v]; for(ll i = 0, h = gcd(v, m) ; i < h ; i ++) for(ll j = i, t = 0 ; t < 2 * (m / h) ; j = calc(j, v), t ++) checkmin(g[calc(j, v)], g[j] + w); } for(ll i = 0 ; i < m ; i ++){ if(g[i] < Inf) printf("%lld\n", g[i]); else printf("-1\n"); } return 0; } |