Cod sursa(job #164033)

Utilizator C_OvidiuCotletz Ovidiu C_Ovidiu Data 23 martie 2008 14:18:21
Problema Vanatoare Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include<stdio.h>
#include<fstream.h>
//#define NM 65536
#define NM 1024
#define inf 18
long i,j,n,D,pre[NM][17],d[17][17],b,c[17],v[17],T,x0,y0,a,N,meet[NM],speed[NM],sol[NM];
long  cmmdc(long a,long b)
 {if(!b) return a;
  else
	return cmmdc(b,a%b);
 }
long max(long a,long b) {return a>b? a:b;}
long min(long a,long b) {return a<b? a:b;}

long euclid(long a,long b)
{long x,y;

if(!b)
   {
   x0=1;y0=0;
   return a;
   }
else
  {
   D=euclid(b,a%b);
   x=y0;
   y=x0-a/b*y0;x0=x;y0=y;
   return D;
   }
}

long CMMC(long A,long B)
{
long M,i,Ac,Bc,j,diva[100],divb[100],nra[100],nrb[100],viz[100],tm;
memset(diva,0,sizeof(diva));
memset(divb,0,sizeof(diva));
memset(nra,0,sizeof(diva));
memset(nrb,0,sizeof(diva));
memset(viz,0,sizeof(diva));
M=1;
Ac=A;
Bc=B;

for(i=2;i<=A;i++)
  if(!(A%i))
   {diva[++diva[0]]=i;
	while(!(A%i)&&A)
	 {A/=i;
	  nra[diva[0]]++;
	  }
   }
for(i=2;i<=B;i++)
  if(!(B%i))
   {divb[++divb[0]]=i;
	while(!(B%i)&&B)
	 {B/=i;
	  nrb[divb[0]]++;
	  }
   }

M=1;
memset(viz,0,sizeof(viz));
A=Ac;B=Bc;
for(i=1;i<=diva[0];i++)
  {
   for(j=1,tm=nra[i];j<=divb[0];j++)
	 if(diva[i]==divb[j])
	   {
	   viz[j]=1;
	   tm=max(tm,nrb[j]);
	   }
   for(j=1;j<=tm;j++)
	 M*=diva[i];
   }
for(i=1;i<=divb[0];i++)
 if(!viz[i])
	 for(j=1;j<=nrb[i];j++)
		 M*=divb[i];
return M;
}



void form_meet()
{long k,j,ci,vi,semn,cj,vj,C,d0,v0;
 N=n;
 for(i=0;i<N;i++)
   {
   meet[1<<i]=c[i+1];
   speed[1<<i]=v[i+1];
   }

 for(k=1;k<(1<<n);k++)
   {
	for(j=n-1;j>=0;j--)
	  if((1<<j)&k)
		{semn=j;break;}
	ci=meet[k^(1<<semn)];

	vi=speed[k^(1<<semn)];
	cj=meet[1<<semn];
	vj=speed[1<<semn];
	if(ci>cj)
	  {ci^=cj;cj^=ci;ci^=cj;
	   vi^=vj;vj^=vi;vi^=vj;
	   }

	if((1<<semn)^k&&ci&&cj)
	{
		 C=cj-ci;
		 a=vi;
		 b=-vj;
		 D=euclid(a,b);
		 if(!(C%D))
		 {
		 a=C/D*x0;

		 d0=a*vi+ci;
		 //d0=
		 C=max(ci,cj);
		 v0=CMMC(vi,vj);
		 if(d0<C)
		  d0=((C-d0)/v0+1)*v0+d0;
		 if(d0<=T)
		  {
		  meet[k]=d0;
		  speed[k]=v0;
		  }
		 }
	}

	}






}








int main()
{

 freopen("vanatoare.in","r",stdin);
 scanf("%ld%ld",&n,&T);
 for(i=1;i<=n;i++)
   scanf("%ld%ld",&c[i],&v[i]);

 form_meet();
 for(i=1;i<(1<<n);i++)
   sol[i]=inf;


 for(i=1;i<(1<<n); i++)
   for(j=1;j<(1<<n);j++)
	  if(meet[j])
	  if(sol[i]>sol[i^j]+1)
		{memcpy(pre[i],pre[i^j],sizeof(pre[i]));
		 pre[i][++pre[i][0]]=meet[j];
		 sol[i]=sol[i^j]+1;
		 }

 freopen("vanatoare.out","w",stdout);
 printf("%ld\n",sol[(1<<n)-1]);
 for(i=1;i<=pre[(1<<n)-1][0];i++)
   printf("%ld ",pre[ (1<<n)-1 ][i]);

 fclose(stdout);
 return 0;
}