Pagini recente » Cod sursa (job #1795721) | Cod sursa (job #1330812) | Cod sursa (job #2316110) | Cod sursa (job #1870025) | Cod sursa (job #166659)
Cod sursa(job #166659)
# 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;
}