Cod sursa(job #184535)

Utilizator albuaAlbu Alexandru albua Data 23 aprilie 2008 19:54:16
Problema Progresii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
#define MAX 110001

FILE *f,*g;
long n,m,i,j,sum[MAX], a[MAX],ratia,ls,ld,mijloc,step;
long k,l;

long calculeaza(long x, long ratia)
{
  long contor=0,i;
  for(i=a[x];i<=l;i+=ratia) contor++;
  return contor;
}

void precalculeaza(void)
{
  long i,j;
  for(i=1;i<n;i++)
	{
	  for(j=i+1;j<=n;j++)
		sum[i]=sum[i]+calculeaza(j,m);   //(l-a[j]+1)/m;
	}
}

int main()
{
  f=fopen("progresii.in","r");
  g=fopen("progresii.out","w");
  fscanf(f,"%ld %ld %ld %ld\n",&n,&m,&k,&l);
  for(i=1;i<=n;i++) fscanf(f,"%ld\n",&a[i]);
  precalculeaza();
  for(j=1;j<=n;j++)
    {
/*      for (step = 1; step < m; step <<= 1);
      for (i = 0; step; step >>= 1)
	 if (i + step < m &&  (l-a[j])/step+1+sum[j]>=k)
	   i += step;
      ratia=i;*/
	  i=j;
	  ls=1;
	  ld=m;
	  while(ls!=ld)
	    {
		  mijloc=(ls+ld)/2;
		  if(/*(l-a[i]+1)/mijloc*/calculeaza(i,mijloc)+sum[i]>k)
		    ls=mijloc+1;
		  else
		    ld=mijloc;
		}
	  ratia=ls;
	  k=k-calculeaza(i, ratia); //(l-a[j]+1)/ratia;
	  fprintf(g,"%ld\n",ratia);
	}
  fclose(f);  fclose(g);
  return 0;
}