Cod sursa(job #164113)

Utilizator razvi9Jurca Razvan razvi9 Data 23 martie 2008 15:46:24
Problema Vanatoare Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<cstdio>
long long n,m,t,i,j,k,c[17],v[17],s[35000],p[35000],r[35000],last[35000],used[35000],st[17];
long long cmmdc(int a,int b)
{
	if(a==0) return b;
	return cmmdc(b%a,a);
}
long long max(long long a,long long b){if(a<b) return b;return a;}
inline void cp(long long &c,long long &v,long long c1,long long v1)
{
	if(v1==v)
		if((c1-c)%v==0) {c=max(c,c1);return;}
		else{c=t+1;return;}
	if(c!=c1){
		while(c!=c1 && c<=t)
			if(c1<c) c1+=v1;
			else c+=v;}
	v=v/cmmdc(v,v1)*v1;
}
inline void sol()
{
	long long cs,vs,num=0;
	cs=c[st[1]];
	vs=v[st[1]];
	num=1<<(st[1]-1);
	for(i=2;i<=k;i++){
		cp(cs,vs,c[st[i]],v[st[i]]);
		if(cs>t) return;
		num=num|(1<<(st[i]-1));}
	s[++m]=num;
	p[m]=cs;
}
inline void getall()
{
	k=1;
	st[k]=1;
	while(k>0){
		sol();
		if(st[k]<n) st[++k]=st[k-1]+1;
		else ++st[--k];}
}
int main()
{
	freopen("vanatoare.in","r",stdin);
	freopen("vanatoare.out","w",stdout);
	scanf("%d %d",&n,&t);
	for(i=1;i<=n;i++){
		scanf("%d %d",&c[i],&v[i]);}
	getall();	
	for(i=1;i<=m;i++){
		r[s[i]]=1;
		used[s[i]]=p[i];}
	n=1<<n;
	for(i=1;i<n;i++)
		if(r[i])
			for(j=1;j<=m;j++){
				k=i|s[j];
				if(!r[k] || r[k]>r[i]+1){
					r[k]=r[i]+1;
					last[k]=i;
					used[k]=p[j];}}
	printf("%d\n",r[n-1]);
	n--;
	while(n){
		printf("%d ",used[n]);
		n=last[n];}
	fclose(stdout);
	return 0;
}