Cod sursa(job #1696616)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 29 aprilie 2016 15:34:12
Problema Bile2 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.58 kb
#include<fstream>
#include<cstring>
#define base 100000
using namespace std;
int n, i, j, dist, k, k1;
char sir[100];
int a[500], b[500], sol1[500], sol2[500], aux[505];
int c[2][1005][500], d[2][1005][500], s[2][1005][500];
int pt[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000};
ifstream fin("bile2.in");
ofstream fout("bile2.out");
void adunare(int a[], int b[], int v[]){
    v[0] = max(a[0], b[0]);
    int i, t = 0;
    for(i = 1; i <= v[0]; i++){
        v[i] = a[i] + b[i] + t;
        t = v[i] / base;
        v[i] %= base;
    }
    if(t != 0){
        v[++v[0]] = t;
    }
}
void scadere(int a[], int b[], int v[]){
    v[0] = a[0];
    int i, t = 0;
    for(i = 1; i <= a[0]; i++){
        v[i] = a[i] - b[i] - t;
        if(v[i] < 0){
            v[i] += base;
            t = 1
            ;
        }
        else{
            t = 0;
        }
    }
    while(v[ v[0] ] == 0 && v[0] > 1){
        v[0]--;
    }
}
void mult(int a[], int b[], int c[]){
    long long d[500];
    d[0] = a[0] + b[0] - 1;
    int i, j, t = 0;
    for(i = 1; i <= d[0]; i++){
        d[i] = 0;
    }
    for(i = 1; i <= a[0]; i++){
        for(j = 1; j <= b[0]; j++){
            d[i + j - 1] += a[i] * 1LL * b[j];
        }
    }
    for(i = 1; i <= d[0]; i++){
        d[i] += t;
        t = d[i] / base;
        d[i] %= base;
    }
    while(t != 0){
        d[++d[0]] = t % base;
        t /= base;
    }
    for(i = 0; i <= d[0]; i++){
        c[i] = d[i];
    }
}
void init(int a[]){
    fin>> sir + 1;
    a[0] = 1;
    int m = strlen(sir + 1);
    int nrcif = 0;
    for(int i = m; i >= 1; i--){
        a[ a[0] ] = a[ a[0] ] + (sir[i] - '0') * pt[nrcif];
        nrcif++;
        if(a[ a[0] ] >= base){
            a[ ++a[0] ] = a[ a[0] - 1] / base;
            a[ a[0] - 1] %= base;
            nrcif = 1;
        }
    }
    int abc = 0;
}
void copiere(int v[], int w[]){
    for(int i = 0; i <= w[0]; i++){
        v[i] = w[i];
    }
}
int compar(int v[], int w[]){
    if(v[0] != w[0]){
        if(v[0] > w[0]){
            return 1;
        }
        else{
            return 0;
        }
    }
    for(int i = v[0]; i >= 1; i--){
        if(v[i] < w[i]){
            return 0;
        }
        else{
            if(v[i] > w[i]){
                return 1;
            }
        }
    }
    return 1;
}
int main(){
    fin>> n >> dist;
    init(a);
    init(b);
    c[0][0][0] = c[0][0][1] = 1;
    k = 1;
    for(i = 1; i <= n; i++){
        c[k][0][0] = c[k][0][1] = 1;
        for(j = 1; j <= i; j++){
            memset(c[k][j], 0, sizeof(c[k][j]));
        }
        for(j = 1; j <= i; j++){
            adunare(c[1 - k][j - 1], c[1 - k][j], c[k][j]);
        }
        k = 1 - k;
    }
    k1 = 1 - k;
   // d[0][0][0] = d[0][0][1] = s[0][0][0] = s[0][0][1] = 1;
    for(i = 1; i <= n; i++){
        d[0][i][0] = d[0][i][1] = 1;
        adunare(d[0][i], d[0][i - 1], d[0][i]);
    }
    k = 1;
    for(i = 2; i <= n; i++){
        for(j = 1; j <= n; j++){
           // memset(s[k][j], 0, sizeof(s[k][j]));
            memset(d[k][j], 0, sizeof(d[k][j]));
        }
        for(j = 1; j <= n; j++){
            if(j > dist){
                copiere(d[k][j], d[1 - k][j - dist - 1]);
            }
            adunare(d[k][j - 1], d[k][j], d[k][j]);
        }
        scadere(c[k1][i], d[k][n], aux);
        mult(a, c[k1][i], sol1);
        mult(b, aux, sol2);
        if(compar(sol2, sol1)){
            fout<< i <<"\n";
            break;
        }
        k = 1 - k;
    }
    return 0;
}