Cod sursa(job #639221)

Utilizator maritimCristian Lambru maritim Data 22 noiembrie 2011 20:09:24
Problema Dirichlet Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include<stdio.h>

#define Mod 9999991
#define ll long long

int N,N1 = 1,N2 = 1,N3,Catalan;

int euclid(int A,int B,int &X,int &Y)
{
	if(B == 0)
	{
		X = 1; Y = 0;
		return A;
	}
	int D = euclid(B,A%B,X,Y);
	int C = X; X = Y; Y = C - (A/B)*Y;
	return D;
}

int lgput(int N,int baza,int exp)
{
	if(exp == 1)
		return N;
	baza = lgput(N,baza,exp/2);
	baza = (1LL*baza*baza)%Mod;
	if(exp&1) baza = (1LL*baza*N)%Mod;
	return baza;
}

int main()
{
	FILE *f = fopen("dirichlet.in","r");
	FILE *g = fopen("dirichlet.out","w");
	
	fscanf(f,"%d ",&N);
	for(int i=2;i<=2*N;i++)
		N1 = (1LL*N1*i)%Mod;
	for(int i=2;i<=N;i++)
		N2 = (1LL*N2*i)%Mod;
	
	ll invN2 = lgput(N2,N2,Mod-2);
	ll invN3 = lgput(N+1,N+1,Mod-2);
	
	Catalan = (((((1LL*N1*invN2)%Mod)*1LL*invN2)%Mod)*1LL*invN3)%Mod;
	
	fprintf(g,"%d ",Catalan);
	
	fclose(g);
	fclose(f);
	return 0;
}