Cod sursa(job #1424043)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 23 aprilie 2015 12:03:50
Problema Dirichlet Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
// (2n)! / ((n + 1)! * n!)

#include <stdio.h>

#define MOD 0x989677

int x, y;
void gcd(int a, int b) {
  if (!b) {
    x = 1;
    y = 0;
    return;
  }
  gcd(b, a - a / b * b);
  int aux = x;
  x = y;
  y = aux - y * (a / b);
}
int main(void) {
  FILE *f;
  int n;
  int ans, div;

  f = fopen("dirichlet.in", "r");
  fscanf(f, "%d", &n);
  fclose(f);

  ans = 1;
  for (int i = n + 2; i <= (n << 1); i++) {
    const unsigned long long tmp = 1ULL * ans * i;
    ans = tmp - tmp / MOD * MOD;
  }
  div = 1;
  for (int i = 2; i <= n; i++) {
    const unsigned long long tmp = 1ULL * div * i;
    div = tmp - tmp / MOD * MOD;
  }
  gcd(div, MOD);
  x = (x <= 0) * MOD + x - x / MOD * MOD;
  const unsigned long long tmp = 1ULL * x * ans;
  f = fopen("dirichlet.out", "w");
  fprintf(f, "%d\n", tmp - tmp / MOD * MOD);
  fclose(f);
  return 0;
}