Cod sursa(job #2000129)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 12 iulie 2017 17:52:39
Problema Bile2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.87 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 1e3 + 5;
const int BASE = 1e9 + 0;
const int DMAX = 1e2 + 5;

char str[DMAX];

int dp[2][NMAX][DMAX], cmb[2][NMAX][DMAX], num3[DMAX];
int num1[DMAX], num2[DMAX], aux[DMAX], num4[DMAX], axn[DMAX];

inline void add(int a[DMAX], int b[DMAX])
{
    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;
    
    return;
}

inline void sub(int a[DMAX], int b[DMAX])
{
    int i, t(0);
    for (i = 1; i <= a[0]; ++i) {
        a[i] -= b[i] + t;
        a[i] += (t = a[i] < 0) * BASE;
    }
    
    while (a[0] > 1 && !a[a[0]])
        --a[0];
    
    return;
}

inline void mul(int a[DMAX], int b[DMAX])
{
    long long t; int i, j;
    memset(axn, 0, (a[0] + b[0] + 1) << 2);
    
    for (i = 1; i <= a[0]; ++i) {
        t = 0;
        for (j = 1; j <= b[0] || t; ++j, t /= BASE) {
            t += axn[i + j - 1] + 1LL * a[i] * b[j];
            axn[i + j - 1] = t % BASE;
        }
        
        if (i + j - 2 > axn[0])
            axn[0] = i + j - 2;
    }
    
    memcpy(a, axn, (axn[0] + 1) << 2);
    return;
}

inline void read(int a[DMAX])
{
    scanf("%s", str + 1);
    int l = (int) strlen(str + 1);
    
    for (int i = l; i >= 1; i -= 9) {
        int nr(0);
        for (int j = max(i - 8, 1); j <= i; ++j)
            nr = nr * 10 + str[j] - '0';
        
        a[++a[0]] = nr;
    }
    
    return;
}

inline int cmp(int a[DMAX], int b[DMAX])
{
    if (a[0] != b[0])
        return a[0] < b[0] ? -1 : 1;
    
    for (int i = a[0]; i >= 1; --i)
        if (a[i] != b[i])
            return a[i] < b[i] ? -1 : 1;
    
    return 0;
}

int main(void)
{
    freopen("bile2.in" , "r", stdin );
    freopen("bile2.out", "w", stdout);
    
    int n, d;
    scanf("%d %d", &n, &d);
    
    read(num1); read(num2);
    for (int i = 0, l = 0; i <= n; ++i, l ^= 1) {
        cmb[l][0][0] = cmb[l][0][1] = 1;
        
        for (int j = 1; j <= i; ++j) {
            memset(cmb[l][j], 0, (cmb[l][j][0] + 1) << 2);
            
            add(cmb[l][j], cmb[l ^ 1][j - 1]);
            add(cmb[l][j], cmb[l ^ 1][j]);
        }
    }
    
    for (int i = 1; i <= n; ++i)
        dp[1][i][0] = 1, dp[1][i][1] = i;
    
    for (int i = 2, l = 0; i <= n; ++i, l ^= 1) {
        for (int j = 1; j <= n; ++j) {
            memset(dp[l][j], 0, (dp[l][j][0] + 1) << 2);
            
            if (j - d - 1 >= 1)
                add(dp[l][j], dp[l ^ 1][j - d - 1]);
            add(dp[l][j], dp[l][j - 1]);
        }
        
        memcpy(num3, num1, DMAX << 2);
        mul(num3, cmb[n & 1][i]);
        
        memcpy(aux, cmb[n & 1][i], DMAX << 2);
        sub(aux, dp[l][n]);
        
        memcpy(num4, num2, DMAX << 2);
        mul(num4, aux);
    
        if (cmp(num3, num4) < 0) {
            printf("%d\n", i);
            break;
        }
    }
    
    return 0;
}