// {{{ file: zel.cc | time: 23:58 13.03.2024 #define _USE_MATH_DEFINES #include <bits/stdc++.h> #define each(...) for (auto& __VA_ARGS__) #define rep(i, b, e) for (int i = (b); i <= (e); i++) #define rev(i, b, e) for (int i = (e); i >= (b); i--) #define mp make_pair #define mt make_tuple #define x first #define y second #define pb push_back #define all(x) (x).begin(), (x).end() #define endl '\n' #define tC template<class using namespace std; tC T> using V = vector<T>; tC T1, class T2> using P = pair<T1,T2>; tC T, class C=greater<T>> using PQ = priority_queue<T,V<T>,C>; tC T> int sz(const T& a) { return (int)a.size(); } tC T> bool amin(T& a, T b) { return b < a ? a = b, 1 : 0; } tC T> bool amax(T& a, T b) { return b > a ? a = b, 1 : 0; } using ll = long long; using pii = P<int,int>; using pll = P<ll,ll>; using vi = V<int>; using vl = V<ll>; using vs = V<string>; using vpi = V<pii>; using vpl = V<pll>; const int oo = 1e9 + 1; const ll OO = ll(1e18) + 1; auto now() { return chrono::high_resolution_clock::now().time_since_epoch().count(); } mt19937 rnd(4488); tC T> T rand(T lo, T hi) { return uniform_int_distribution<T>{lo,hi}(rnd); } struct Debug { #ifdef SPONGE tC T>Debug operator<<(const T& x) { cerr<<"\033[1;33m"<<x<<"\033[0m"; #else tC T>Debug operator<<(const T&) { #endif return *this; } } dbg; #define $(x) #x<<'='<<(x)<<' ' void boost() { ios_base::sync_with_stdio(0); cin.tie(0); cout.precision(15); cout.setf(ios::fixed,ios::floatfield); cerr.precision(15); cerr.setf(ios::fixed,ios::floatfield); } namespace { void solve(); } // }}} int main() { boost(); //rnd.seed(now()); int t=1; //cin>>t; rep(i,1,t){ //cout<<"Case #"<<i<<": "; solve(); } } namespace { const int N=7077; int n,k,m; vpi zbior[N]; ll dp1[N],dp2[N],odp1[N],odp2[N]; void solve() { cin>>n>>k>>m; rep(i,1,n){ int kol,wag,cen; cin>>kol>>wag>>cen; zbior[kol].pb(mp(wag,cen)); } dp1[0]=0; rep(i,1,m-1) dp1[i]=OO; rep(kol,1,k){ rep(i,0,m-1) dp2[i]=OO; each([wag,cen]:zbior[kol]){ rep(mas,0,m-1) amin(dp2[(mas+wag)%m],dp1[mas]+cen); } rep(i,0,m-1) dp1[i]=dp2[i]; } rep(i,0,m-1) rep(mas,0,m-1) amin(dp1[(2*mas)%m],2*dp1[mas]); odp1[0]=0; rep(i,1,m-1) odp1[i]=OO; rep(wag,0,m-1){ rep(i,0,m-1) odp2[i]=odp1[i]; rep(mas,0,m-1) amin(odp2[(mas+wag)%m],odp1[mas]+dp1[wag]); rep(i,0,m-1) odp1[i]=odp2[i]; } rep(wag,0,m-1){ if(odp1[wag]==OO) cout<<-1<<endl; else cout<<odp1[wag]<<endl; } } }
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 | // {{{ file: zel.cc | time: 23:58 13.03.2024 #define _USE_MATH_DEFINES #include <bits/stdc++.h> #define each(...) for (auto& __VA_ARGS__) #define rep(i, b, e) for (int i = (b); i <= (e); i++) #define rev(i, b, e) for (int i = (e); i >= (b); i--) #define mp make_pair #define mt make_tuple #define x first #define y second #define pb push_back #define all(x) (x).begin(), (x).end() #define endl '\n' #define tC template<class using namespace std; tC T> using V = vector<T>; tC T1, class T2> using P = pair<T1,T2>; tC T, class C=greater<T>> using PQ = priority_queue<T,V<T>,C>; tC T> int sz(const T& a) { return (int)a.size(); } tC T> bool amin(T& a, T b) { return b < a ? a = b, 1 : 0; } tC T> bool amax(T& a, T b) { return b > a ? a = b, 1 : 0; } using ll = long long; using pii = P<int,int>; using pll = P<ll,ll>; using vi = V<int>; using vl = V<ll>; using vs = V<string>; using vpi = V<pii>; using vpl = V<pll>; const int oo = 1e9 + 1; const ll OO = ll(1e18) + 1; auto now() { return chrono::high_resolution_clock::now().time_since_epoch().count(); } mt19937 rnd(4488); tC T> T rand(T lo, T hi) { return uniform_int_distribution<T>{lo,hi}(rnd); } struct Debug { #ifdef SPONGE tC T>Debug operator<<(const T& x) { cerr<<"\033[1;33m"<<x<<"\033[0m"; #else tC T>Debug operator<<(const T&) { #endif return *this; } } dbg; #define $(x) #x<<'='<<(x)<<' ' void boost() { ios_base::sync_with_stdio(0); cin.tie(0); cout.precision(15); cout.setf(ios::fixed,ios::floatfield); cerr.precision(15); cerr.setf(ios::fixed,ios::floatfield); } namespace { void solve(); } // }}} int main() { boost(); //rnd.seed(now()); int t=1; //cin>>t; rep(i,1,t){ //cout<<"Case #"<<i<<": "; solve(); } } namespace { const int N=7077; int n,k,m; vpi zbior[N]; ll dp1[N],dp2[N],odp1[N],odp2[N]; void solve() { cin>>n>>k>>m; rep(i,1,n){ int kol,wag,cen; cin>>kol>>wag>>cen; zbior[kol].pb(mp(wag,cen)); } dp1[0]=0; rep(i,1,m-1) dp1[i]=OO; rep(kol,1,k){ rep(i,0,m-1) dp2[i]=OO; each([wag,cen]:zbior[kol]){ rep(mas,0,m-1) amin(dp2[(mas+wag)%m],dp1[mas]+cen); } rep(i,0,m-1) dp1[i]=dp2[i]; } rep(i,0,m-1) rep(mas,0,m-1) amin(dp1[(2*mas)%m],2*dp1[mas]); odp1[0]=0; rep(i,1,m-1) odp1[i]=OO; rep(wag,0,m-1){ rep(i,0,m-1) odp2[i]=odp1[i]; rep(mas,0,m-1) amin(odp2[(mas+wag)%m],odp1[mas]+dp1[wag]); rep(i,0,m-1) odp1[i]=odp2[i]; } rep(wag,0,m-1){ if(odp1[wag]==OO) cout<<-1<<endl; else cout<<odp1[wag]<<endl; } } } |