Cod sursa(job #169331)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 1 aprilie 2008 16:59:27
Problema Vanatoare Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 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]]);
	}
}

void baga(int i,int mask,int ask)
{
	if(dt[mask]>D) return ;
	if(i==n)
	{
		if(A[ask^mask]+1<A[ask]) A[ask]=A[mask^ask]+1,par[ask]=mask;
		return ;
	}
	baga(i+1,mask,ask);	
	if(pt(i)&ask)
		baga(i+1,mask|pt(i),ask);
}

int main()
{
	int i,j,k;
	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;
		k=i^pt(j);
		cmmmc[i] = cmmmc[k]/cmmdc(cmmmc[k],P[j].f)*P[j].f;
		if(cmmmc[i]>D) cmmmc[i]=D+1;
		for(dt[i]=dt[k];dt[i]<=D && dt[i]%P[j].f!=P[j].s;dt[i]+=cmmmc[k]);
		baga(0,0,i);
/*		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;
}