Cod sursa(job #328352)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 1 iulie 2009 19:04:31
Problema Bile2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <stdio.h>
#include <string.h>
using namespace std;
#define BASE 1000000000
#define FORMAT "%09d"
#define NRC 9
#define NMAX 1010
#define CMAX 70
#define LL long long
int N, D;
int A[CMAX];
int B[CMAX];
int aux[CMAX];
int aux1[CMAX];
char s[CMAX];
int ant[NMAX][CMAX];
int cur[NMAX][CMAX];
int comb[NMAX][CMAX];
inline int MAX(int a, int b) { return (a > b) ? a : b; }
void get(int a[], char s[])
{
    int n = strlen(s), i, j, q;
    a[0] = 0;

    for (i = n - 1; i >= 0; i -= NRC) {
	for (j = MAX(0, i - NRC + 1), q = 0; j <= i; j++) q = q * 10 + s[j] - '0';
	a[++a[0]] = q;
    }
}
void print_nr(int a[])
{
    int i;

    printf("%d", a[a[0]]);

    for (i = a[0] - 1; i >= 1; i--)
	printf(FORMAT, a[i]);

    printf("\n");
}
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;
}
int C[CMAX];
void mul(int A[], int B[])
{
	  int i, j;
	    LL t;
	   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]+(LL)A[i]*B[j])%BASE;
	      if (i + j - 2 > C[0]) C[0] = i + j - 2;
	 }
       memcpy(A, C, sizeof(C));
}
int mai_mic(int a[], int b[])
{
    if (a[0] < b[0]) return 1;
    if (a[0] > b[0]) return 0;
    for (int i = a[0]; i >= 1; i--) {
	if (a[i] < b[i]) return 1;
	if (a[i] > b[i]) return 0;
    }
return 1;
}
void scad(int a[], int b[])
{
    int i;
    for (i = 1; i <= a[0]; i++) {
	a[i] -= b[i];
	if (a[i] < 0) a[i] += BASE, a[i+1]--;
    }
    while (a[0] && !a[a[0]]) a[0]--;
}
int main()
{
    int i, j;
    freopen("bile2.in", "r", stdin);
    freopen("bile2.out", "w", stdout);
    scanf("%d %d", &N, &D);
    scanf("%s", s);
    get(A, s);
    scanf("%s", s);
    get(B, s);
    ant[0][0] = 1; ant[0][1] = 1;
    for (i = 1; i <= N; i++) {
	cur[0][0] = 1; cur[0][1] = 1;
	for (j = 1; j <= i; j++) {
		memcpy(cur[j], ant[j - 1], sizeof(cur[j]));
		add(cur[j], ant[j]);
	}
	memcpy(ant, cur, sizeof(cur));
    }
    memcpy(comb, cur, sizeof(cur));
    memset(ant, 0, sizeof(ant));
    memset(cur, 0, sizeof(cur));
    for (i = 1; i <= N; i++) {
	for (j = 1; j <= N; j++) {
	    if (i == 1) {
		cur[j][0] = 1; cur[j][1] = 1;
		add(cur[j], cur[j-1]);
	    } else {
		memcpy(cur[j], cur[j-1], sizeof(cur[j]));
		if (j - D - 1 > 0) add(cur[j], ant[j - D - 1]);
	    }
	}
	memcpy(aux, comb[i], sizeof(aux));
	memcpy(aux1, cur[N], sizeof(aux));
	scad(aux, aux1);
	mul(aux, B);
	memcpy(aux1, comb[i], sizeof(aux1));
	mul(aux1, A);
	if (mai_mic(aux1, aux)) break;
	memcpy(ant, cur, sizeof(ant));
    }
    printf("%d\n", i);
return 0;
}