Cod sursa(job #167488)

Utilizator DorinOltean Dorin Dorin Data 29 martie 2008 17:15:04
Problema Vanatoare Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
# include <stdio.h>
# include <vector>

using namespace std;

# define input "vanatoare.in"
# define output "vanatoare.out"

# define maxN 16
# define max 1<<maxN
# define INF 32
# define maxim(a,b) (a>b?a:b)

int n,s,i,p,nr, sc[maxN];
int d[max],j,k;

vector < vector < int > > sol;

struct lll
{
	int r,p;
}b[max];

int cmmdc(int a,int b)
{
	int r;
	while(b)
	{
		r = a%b;
		a = b;
		b = r;
	}	
	return a;
}

lll comb(lll a,lll b)
{	
	lll ret;
	ret.r = ret.p = -1;
	if(a.r == -1 || b.r == -1)
		return ret;
		
	if(a.p == b.p)
	{
		if(a.r != b.r)
			return ret;
		return a;
	}
	
	int i,prod,d,ok;
	d = cmmdc(a.p,b.p);
	d = (a.p * b.p) / d;
	ok = 0;
	for(i=0;i*a.p<=s;i++)
	{
		prod = i*a.p + a.r;
		if((prod - b.r) % b.p == 0)
			{ok = 1;break;}
	}
	if (ok)
	{
		ret.p = d;
		ret.r = maxim((i*a.p + a.r) % d,maxim(a.r + a.p , b.r + b.p));
	}
	
	
	return ret;
}

int main()
{
    freopen(input,"r", stdin);
    freopen(output,"w", stdout);
    
    scanf("%d%d",&n,&s);
       
    for(i=0;i<n;i++)
    {
    	scanf("%d%d",&b[1<<i].r,&b[1<<i].p);
    }
    b[0].r = 0;
    b[0].p = 1;
    for(i=1;i<(1<<n);i++)
    {
    	p = (i&(i-1))^i;
    	if(p == i)
    		continue;
    		
    	b[i] = comb(b[i-p],b[p]);
    }
    
    sol.resize((1<<n)+1);
    
    d[0] = 0;
    for(i=1;i<(1<<n);i++)
    {
    	d[i] = INF;
    	int aux = i;
    	nr = 0;
    	j = 0;
    	while(aux)
    	{
    		if(aux&1)
    			sc[nr++] = j;
    		j++;
    		aux >>= 1;    			
    	}
    	
    	for(j = 1;j<(1<<nr);j++)
    	{
    		int mask=0;
    		aux = j;
    		k = 0;
    		while(aux)
    		{
    			if(aux & 1)
    				mask+=1 << sc[k];
    			k++;
    			aux >>= 1;
    		}
    		if(b[mask].p != -1)
    		{
    			if(d[i] > d[i-mask])
    			{
    				d[i] = d[i-mask];
    				sol[i].resize(d[i] + 1);
    				for(k=0;k<d[i];k++)
    					sol[i][k] = sol[i-mask][k];
    				sol[i][d[i]] = b[mask].r;
    			}
    		}
    	}
    	
    	d[i] ++;
    }
    k = (1<<n)-1;
    printf("%d\n",d[k]);
    
    for(i=0;i<d[k];i++)
    	printf("%d ",sol[k][i]);
    
    return 0;
}