Cod sursa(job #636378)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 19 noiembrie 2011 19:28:34
Problema Dirichlet Scor 92
Compilator cpp Status done
Runda .com 2011 Marime 1.04 kb
#include <cstdio>

#define M 9999991
#define MAXN 2000005
#define ll long long
using namespace std;

int N;
ll fact[MAXN];
void invers(ll &m, ll &n, int o, int p)  
{  
      if (!p)  
       m = 1, n = 0;  
       else   {             
		invers(m, n, p, o % p);
        ll a = m;
		m = n;
        n = a - n * (o / p);
       }
}

int combk (int x, int y) {

	ll px = 1, py = 1, pxy = 1;
	ll ipy = 0, ipxy = 0;
	
	px = fact[x]; py = fact[y]; pxy = fact[x - y];

	ll  mm = 0, nn = 0;
	invers  (ipy, mm, py, M);
	invers  (ipxy, nn, pxy, M);       
	
	if (ipy <= 0) ipy = M + ipy % M;
	if (ipxy <= 0) ipxy = M + ipxy %  M;
	
	//printf ("%d %d %d\n", px, ipy, ipxy);
	ll p1 = (px * ipy) % M ;
	p1 = (p1 * ipxy) % M;
	return p1;
}
int main() {

	freopen("dirichlet.in", "r", stdin);
	freopen("dirichlet.out", "w", stdout);


	scanf("%d\n", &N);
	fact[0] = 1;

	for(int i = 1; i <= 2 * N; i++)
		fact[i] = (fact[i - 1] * i) % M;

	ll iN = 0, p;
	
	invers(iN, p, (N + 1), M);
	
	if(iN <= 0) iN = M + iN % M;
	
	printf("%lld\n", (combk(2 * N, N) * iN) % M);
	return 0;
}