Cod sursa(job #253367)

Utilizator 630r63Ilinca George Mihai 630r63 Data 5 februarie 2009 18:29:37
Problema Bile2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.49 kb
 #include <cstdio>  
 #include <cstring>  
 #include <cassert>  
   
 const int Base = 10000;  
 const int Lmax = 128;  
 const int Nmax = 1024;  
   
 int N, D;  
 int X[Lmax], Y[Lmax];  
 int Comb[Lmax];  
 int A[Nmax][Lmax], B[Nmax][Lmax];  
   
 void Add(int A[], int B[]) {  
     int i, t = 0;  
     for (i = 1; i <= A[0] || i <= B[0] || t; ++i, t /= Base)  
         A[i] = (t += A[i] + B[i]) % Base;  
     A[0] = i-1;  
 }  
   
 void Substract(int A[], int B[]) {  
     for (int i = 1; i <= A[0]; ++i) {  
         if (A[i] < B[i]) {  
             A[i] += Base;  
             --A[i+1];  
         }  
         A[i] -= B[i];  
     }  
    while (A[0] && !A[A[0]]) --A[0];  
 }  
   
 void Multiply(int A[], int B) {  
     int i, t =0 ;  
     for (i = 1; i <= A[0] || t; ++i, t /= Base)  
         A[i] = (t += A[i] * B) % Base;  
     A[0] = i-1;  
 }  
   
 void Multiply(int A[], int B[]) {  
     int i, j, t, C[Lmax];  
     memset(C, 0, sizeof(C));  
     for (i = 1; i <= A[0]; ++i) {  
         for (t = 0, j = 1; j <= B[0] || t; ++j, t /= Base)  
             C[i+j-1] = (t += C[i+j-1] + A[i]*B[j]) % Base;  
         if (i+j-2 > C[0]) C[0] = i+j-2;  
     }  
     memcpy(A, C, sizeof(C));  
 }  
   
 void Divide(int A[], int B) {  
     int i, t = 0;  
     for (i = A[0]; i; --i, t %= B)  
         A[i] = (t = t*Base + A[i]) / B;  
    while (A[0] && !A[A[0]]) --A[0];  
 }  
   
 void Atrib(int A[], int B[]) {  
     for (int i = 0; i < Lmax; ++i)  
         A[i] = 0;  
     for (int i = 0; i <= B[0]; ++i)  
         A[i] = B[i];  
 }  
   
 int Greater(int A[], int B[]) {  
     if (A[0] != B[0]) return A[0] > B[0];  
     for (int i = A[0]; i; --i) {  
         if (A[i] > B[i]) return 1;  
         if (A[i] < B[i]) return 0;  
     }  
     return 1;  
 }  
  
 void Atrib(int A[], char s[]) {  
     int Length = strlen(s);  
     A[0] = 1;  
     for (int i = Length-1, pow = 1; i >= 0; --i) {  
         A[A[0]] += pow*(s[i]-'0');  
         if ((pow *= 10) == 10000 && i > 0) {  
             pow = 1;  
             ++A[0];  
         }  
     }  
 }  
   
 void ReadData() {     
     char buf[128];  
   
     assert(scanf("%d %d\n", &N, &D) == 2);  
     assert(1 <= N && N <= 1000);  
     assert(1 <= D && D < N);  
   
     assert(scanf("%s", buf) == 1);  
     assert(strlen(buf) <= 64);  
     Atrib(X, buf);  
   
     assert(scanf("%s", buf) == 1);  
     assert(strlen(buf) <= 64);  
     Atrib(Y, buf);  
 }  
   
 void Solve() {  
     int Aux[Lmax];  
   
     Atrib(Aux, Y);  
     Substract(Aux, X);  
     Atrib(X, Aux);  
   
     for (int i = 1; i <= N; ++i)  
         A[i][ A[i][0] = 1 ] = i;  
   
     Comb[0] = 1; Comb[1] = N;  
   
     for (int i = 2; i <= N; ++i) {  
   
         for (int j = D+2; j <= N; ++j)  
             Atrib(B[j], A[j-D-1]);  
         for (int j = D+2; j <= N; ++j)  
             Add(B[j], B[j-1]);  
   
         Multiply(Comb, N-i+1);  
         Divide(Comb, i);  
   
         int C1[Lmax], C2[Lmax];  
         Atrib(C1, Comb); Multiply(C1, X);  
         Atrib(C2, B[N]); Multiply(C2, Y);  
   
         if (Greater(C1, C2)) {  
             printf("%d\n", i);  
             return;  
         }  
   
         memcpy(A, B, sizeof(B));  
         memset(B, 0, sizeof(B));  
     }  
 }  
   
 int main() {  
     freopen("bile2.in", "r", stdin);  
     freopen("bile2.out", "w", stdout);  
   
     ReadData();  
     Solve();  
}