Nu exista pagina, dar poti sa o creezi ...
Cod sursa(job #183344)
Utilizator | 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;
}