Cod sursa(job #166659)

Utilizator DorinOltean Dorin Dorin Data 28 martie 2008 12:04:00
Problema Vanatoare Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
# include <stdio.h>

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

# define maxN 8
# define max 1<<maxN
# define INF 32
# define minim(a,b) (a<b?a:b)

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

struct lll
{
	int r,p;
}a[maxN],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 = (i*a.p + a.r) % d;
	}
	
	
	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",&a[i].r,&a[i].p);
    	b[1<<i] = a[i];
    }
    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]);
    }
    
    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];
    				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;
}