Cod sursa(job #165340)

Utilizator test_btestb testb test_b Data 25 martie 2008 21:01:02
Problema Progresii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include<stdio.h>

long long p,u,mij,q,j,s,n,m,k,l,i,x,y,t,spm,pm;

long long v[110001];




int main(){
  FILE *f=fopen("progresii.in","r");
  fscanf(f,"%lld %lld %lld %lld",&n,&m,&k,&l);
  for(i=1;i<=n;i++){
    fscanf(f,"%lld",&x);
    v[i]=l-x;
    pm = 1+v[i]/m;
    spm+=pm;
  }
  FILE *g = fopen("progresii.out","w");
  if (spm<=k) {
    //caut cea mai mica valoare t ai t<=m spm-(1+v[i]/t)<=k-(1+v[i]/m)
    for (i=1;i<=n;i++) {
      //caut t

      p=1;u=m;
      while (p<=u) {
	mij=(p+u)/2;
	if (spm-(1+v[i]/(m))>k-(1+v[i]/mij)) {
	  p=mij+1;
	} else u=mij-1;
      }

      t=p;
      t=1;
      while (spm-(1+v[i]/(m))>k-(1+v[i]/t)) {
	t++;
	if (t==m+1)
	  break;
      }


      fprintf(g,"%lld\n",t);
      spm-=(1+v[i]/m);
      k-=(1+v[i]/t);
    }
  } else
    fprintf(g,"-1");
  fclose(g);
  fclose(f);
  return 0;
}