Cod sursa(job #169323)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 1 aprilie 2008 16:49:37
Problema Vanatoare Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

#define pt(i) (1<<(i))
#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define f first
#define s second

int cmmdc(int i,int j)
{
	while(i&&j)
		if(i>=j)
			i%=j;
		else
			j%=i;
	return i^j;
}

typedef long long lint;

int n,D,A[pt(16)],par[pt(16)];
lint cmmmc[pt(16)],dt[pt(16)];
pair<lint,lint> P[16];

void doit(int i)
{
	if(i)
	{
		doit(i^par[i]);
		printf("%lld ",dt[par[i]]);
	}
}

int main()
{
	int i,j;
	freopen("vanatoare.in","r",stdin);
	freopen("vanatoare.out","w",stdout);
	scanf("%d %d",&n,&D);
	FOR(i,0,n)
		scanf("%d %d",&P[i].s,&P[i].f);
	sort(P,P+n);
	reverse(P,P+n);
	cmmmc[0]=1,dt[0]=0;
	FOR(i,1,pt(n))
	{
		A[i]=n+1;
		FOR(j,0,n) if(pt(j)&i) break;
		cmmmc[i] = cmmmc[i^pt(j)]/cmmdc(cmmmc[i^pt(j)],P[j].f)*P[j].f;
		if(cmmmc[i]>D) cmmmc[i]=D+1;
		for(dt[i]=dt[i^pt(j)];dt[i]<=D && dt[i]%P[j].f!=P[j].s;dt[i]+=cmmmc[i^pt(j)]);
		for(j=i;j;j=(j-1)&i)
			if(dt[j]<=D && A[i]>A[i^j]+1)
				A[i]=A[i^j]+1,par[i]=j;
	}
	printf("%d\n",A[pt(n)-1]);
	doit(pt(n)-1);
	printf("\n");
	return 0;
}