Cod sursa(job #44482)

Utilizator mika17Mihai Alex Ionescu mika17 Data 31 martie 2007 14:36:47
Problema Next Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <stdio.h>
#include <string.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 c;
 while ( scanf("%c",&c)!=EOF & c>='0' & c<='9'& c!='\n' )
 {
  A[++A[0]] = c - '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 swap(int &x,int &y)
{
 int aux = x;
 x = y;
 y = aux;
}

void reverse(int A[])
{
 for ( int i = 1 ; i <= A[0]/2 ; ++i)
  swap(A[i],A[A[0] - i + 1]);
}

void readData()
{
 freopen(fin,"r",stdin);
 read(N);
 reverse(N);
 read(D);
 reverse(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);
       }
    }
}

void solve()
{
 int C1[DMAX],C2[DMAX];
 C1[0] = 1; memset(C1+1,0,sizeof (int) * (DMAX-1) );
 C2[0] = 1; memset(C2+1,0,sizeof (int) * (DMAX-1) );
 mod(N,D,C1);
 if(!C1[1]) write(N);
  else
  {
   sub(D,C1,C2);
   C1[0] = 1; memset(C1+1,0,sizeof (int) * (DMAX-1) );
   add(N,C2,C1);
   write(C1);
  }
}

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