Pagini recente » Cod sursa (job #971701) | Cod sursa (job #544389) | Cod sursa (job #1882626) | Cod sursa (job #918256) | Cod sursa (job #164113)
Cod sursa(job #164113)
#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;
}