Cod sursa(job #1239)

Utilizator cristi8Constantin-Cristian Balas cristi8 Data 12 decembrie 2006 22:31:55
Problema A+B Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NMAX 22
#define BNCMAX 15
#define BNMOD 1000

int n, b, p, q;
typedef struct bn bn;
struct bn {
  int c[BNCMAX];
};

bn a[NMAX][NMAX];
bn s[NMAX];
bn sola, solb;

void bnadd(bn *a, bn *b)
{
  int i, r;
  for(i = 1, r = 0; i <= a->c[0] || i <= b->c[0] || r; i++)
  {
    a->c[i] += b->c[i] + r;
    r = a->c[i] / BNMOD;
    a->c[i] %= BNMOD;
  }
  a->c[0] = i-1;
}

void bnmul(bn *a, int val)
{
  int i, r;
  for(i = 1, r = 0; i <= a->c[0] || r; i++)
  {
    a->c[i] = val*a->c[i] + r;
    r = a->c[i] / BNMOD;
    a->c[i] %= BNMOD;
  }
  a->c[0] = i-1;
}

void inttobn(int val, bn *a)
{
  memset(a, 0, sizeof(bn));
  a->c[0] = a->c[1] = 1;
  bnmul(a, val);
}

void bnshow(bn *a)
{
  int i;
  printf("%d", a->c[a->c[0]]);
  for(i = a->c[0]-1; i; i--)
    printf("%03d", a->c[i]);
}

void solve()
{
  int i, j, k;
  bn tmp;
  inttobn(b-1, &a[1][0]);
  for(i = 2; i <= n; i++)
  {
    j = 0;
    for(k = 0; k <= p; k++)
    {
      memcpy(&tmp, &a[i-1][k], sizeof(bn));
      bnmul(&tmp, b-1);
      bnadd(&a[i][0], &tmp);
    }
    for(j = 1; j <= p; j++)
      memcpy(&a[i][j], &a[i-1][j-1], sizeof(bn));
  }
  for(i = 0; i <= p; i++)
    bnadd(&sola, &a[n][i]);

  memset(a, 0, sizeof(a));
  inttobn(b-1, &a[1][0]);
  for(i = 2; i <= n; i++)
  {
    j = 0;
    for(k = 0; k < q; k++)
    {
      memcpy(&tmp, &a[i-1][k], sizeof(bn));
      bnmul(&tmp, b-1);
      bnadd(&a[i][0], &tmp);
    }
    for(j = 1; j < q; j++)
      memcpy(&a[i][j], &a[i-1][j-1], sizeof(bn));
    memcpy(&s[i], &s[i-1], sizeof(bn));
    bnmul(&s[i], b);
    bnadd(&s[i], &a[i-1][q-1]);
  }
  memcpy(&solb, &s[n], sizeof(bn));
}

int main()
{
  freopen("zero.in", "r", stdin);
  freopen("zero.out", "w", stdout);
  scanf("%d%d%d%d", &n, &b, &p, &q);
  solve();
  bnshow(&sola);
  printf("\n");
  bnshow(&solb);
  printf("\n");
  return 0;
}