Cod sursa(job #183344)

Utilizator albuaAlbu Alexandru albua Data 21 aprilie 2008 22:57:24
Problema Progresii Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <stdio.h>
#include <string.h>
#define MAX 5000

typedef int Huge[MAX];

FILE *f,*g;
long n,m,x,len,i,j,cat,rest;
char K[MAX],L[MAX];
Huge k,l,suma,c,temp;

void add(Huge A, Huge B)
{
  int i,t=0;
  for(i=1;i<=A[0] || i<=B[0] ||t; i++,t/=10)
    A[i]=(t+=A[i]+B[i])%10;
  A[0]=i-1;
}

void sub(int A[], int B[])
{
  int i, t = 0;
  for (i = 1; i <= A[0]; i++)
    A[i] += (t = (A[i] -= B[i] + t) < 0) * 10;
  for (; A[0] > 1 && !A[A[0]]; A[0]--);
}

void div(int A[], int B)
{
  int i, t = 0;
  for (i = A[0]; i > 0; i--, t %= B)
     A[i] = (t = t * 10 + A[i]) / B;
  for (; A[0] > 1 && !A[A[0]]; A[0]--);
}

void dif(Huge a, long x)
{
  int i,t=0;
  for(i=1;i<=c[0];i++)c[i]=0;
  c[0]=0;
  while(x!=0)
    {
	  c[++c[0]]=x%10;
	  x/=10;
	}
  for (i = 1; i <= a[0]; i++)
    a[i] += (t = (a[i] -= c[i] + t) < 0) * 10;
  for (; a[0] > 1 && !a[a[0]]; a[0]--);

}

int cmpin(Huge a, long x)
{
  int i;
  for(i=1;i<=c[0];i++)c[i]=0;
  c[0]=0;
  while(x!=0)
    {
	  c[++c[0]]=x%10;
	  x/=10;
	}
  if(a[0]<c[0]) return -1;
  else if(a[0]>c[0]) return 1;
	 else
		   for(i=a[0];i>=1;i--)
		     if(a[i]>c[i])return 1;
		     else if(a[i]<c[i]) return -1;
  return 0;

}

int cmp(Huge a, Huge b)
{
  int i;
  if(a[0]<b[0]) return -1;
  else if(a[0]>b[0]) return 1;
         else
		   for(i=a[0];i>=1;i--)
		     if(a[i]>b[i])return 1;
		     else if(a[i]<b[i]) return -1;
  return 0;
}

int main()
{
  f=fopen("progresii.in","r");
  g=fopen("progresii.out","w");
  fscanf(f,"%ld %ld",&n,&m);
  fscanf(f,"%s %s\n",K,L); 
  len=strlen(K);
  for(i=len-1;i>=0;i--)
    k[++k[0]]=K[i]-'0';
  len=strlen(L);
  for(i=len-1;i>=0;i--)
    l[++l[0]]=L[i]-'0';
  for(j=1;j<=n;j++)
    {
	  fscanf(f,"%ld\n",&x);
	  for(i=0;i<=l[0];i++)temp[i]=l[i];
	  dif(temp,x-1);
	  add(suma,temp);
	} 	
  if(cmp(suma,k)<=0)
    {
	  for(i=1;i<=n;i++)
	    fprintf(g,"1\n");
	}
  else
    {
       //suma este mai mica decat k;
       sub(suma,k);
	   while(cmpin(suma,m)>=0)
	     {
		   dif(suma,m);
		   cat++;
		 }
	 for(i=suma[0];i>=1;i--)
	   rest=rest*10+suma[i];

	}
  for(i=1;i<=n-cat-1;i++)
    fprintf(g,"1\n");
  fprintf(g,"%ld\n",1+rest);
  for(i=1;i<=cat;i++)
    fprintf(g,"%ld\n",m);
  fclose(f);  fclose(g);
  return 0;
}