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
#include <cstdio>
#include <vector>
#define MAKS 7010
using namespace std;
typedef long long int lld;
vector< pair<int,int> > zelki[MAKS];
lld koszt[2][MAKS];
lld f[MAKS];
bool bylo[MAKS];
int main()
{
	int n,k,m;
	scanf("%d %d %d",&n,&k,&m);
	for(int i=0;i<n;i++)
	{
		int ki,mi,ci;
		scanf("%d %d %d",&ki,&mi,&ci);
		zelki[ki].push_back(make_pair(mi, ci));
	}
	koszt[0][0]=0;
	for(int i=1;i<m;i++)koszt[0][i]=-1;
	int akt=0;
	for(int i=1;i<=k;i++)
	{
		akt=1-akt; 
		for(int q=0;q<m;q++)koszt[akt][q]=-1;
		for(int j=0;j<zelki[i].size();j++)
		{
			int mi=zelki[i][j].first;
			lld ci=lld(zelki[i][j].second);
			for(int q=0;q<m;q++)
			{
				int nast=(q+mi)%m;
				if(koszt[1-akt][q]==-1)continue;
				if(koszt[akt][nast]==-1 || koszt[1-akt][q]+ci < koszt[akt][nast])
				{
					koszt[akt][nast]=koszt[1-akt][q]+ci;
				}
			}
		}
	}
	
	f[0]=0;
	for(int i=1;i<m;i++)f[i]=-1;
	int v=0;
	do
	{
		bylo[v]=true;
		for(int q=0;q<m;q++)
		{
			if(koszt[akt][q]==-1)continue;
			int u=(v+q)%m;
			if(f[u]==-1 || f[v]+koszt[akt][q]<f[u])
			{
				f[u]=f[v]+koszt[akt][q];
			}
		}
		lld nvmin=-1;
		for(int q=0;q<m;q++)
		{
			if(bylo[q] || f[q]==-1)continue;
			if(nvmin==-1 || f[q]<nvmin)
			{
				nvmin=f[q];
				v=q;
			}
		}
		if(nvmin==-1)break;
	}
	while(1);
	for(int i=0;i<m;i++)printf("%lld\n",f[i]);
}