Cod sursa(job #44607)

Utilizator mika17Mihai Alex Ionescu mika17 Data 31 martie 2007 16:13:38
Problema Next Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define fin "next.in"
#define fout "next.out"
#define NMAX 1000002
#define DMAX 18
int N[NMAX],D[DMAX];

void read(int A[])
{
 char * s = (char*) malloc(NMAX);
 gets(s);
 A[0] = strlen(s);
 for(int i = A[0] ; i ; --i)
    A[i] = s[A[0]-i] - '0';
}

void write(int A[])
{
 freopen(fout,"w",stdout);
 for ( int i = A[0] ; i ; --i)
     printf("%d",A[i]);
 printf("\n");
 fclose(stdout);
}

void readData()
{
 freopen(fin,"r",stdin);
 read(N);
 read(D);
 fclose(stdin);
}

void lshift(int A[],int x)
{
 memmove(&A[1+x],&A[1],sizeof (int) * A[0]);
 memset(&A[1],0,sizeof(int) * x);
 A[0] += x;
}

int sgn(int A[], int B[])
{
 int i;
 if(A[0]>B[0]) return 1;
 if(A[0]<B[0]) return -1;
 for (i = A[0] ; i>1 && A[i]==B[i]; --i);
 return A[i] < B[i] ? -1:A[i] == B[i] ? 0 : 1;
}

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

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

void mod(int X[], int Y[], int R[])      // R = X % Y
{
 int tmp[DMAX];
 for ( int i = X[0] ; i ; --i )
    {
     if(R[1] | R[0]>1) lshift(R,1);
     R[1] = X[i];
     while(sgn(R,Y) != -1)
       {
	memset(tmp,0,sizeof tmp);
	sub(R,Y,tmp);
	memmove(R,tmp,sizeof tmp);
       }
    }
}

int C1[DMAX],C2[NMAX];

void solve()
{
 C1[0] = 1;
 C2[0] = 1;
 mod(N,D,C1);
 if(C1[1])
 {
  sub(D,C1,C2);
  add(N,C2,N);
 }
 write(N);
}

int main()
{
 readData();
 solve();
 return 0;
}