Cod sursa(job #717206)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 19 martie 2012 19:02:34
Problema Dirichlet Scor 92
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include<fstream>
#define MOD 9999991
using namespace std;
long long N,N2,termen1,termen2,sol;

inline void Citire()
{
	ifstream fin("dirichlet.in");
	fin>>N; N2=2*N;
	fin.close();
}

inline void InversModular(long long A,long long B,long long &x,long long &y)
{
	if(B==0LL)
	{
		x=1LL;
		y=0LL;
		return;
	}
	InversModular(B,A%B,x,y);
	long long aux,q=A/B;
	aux=x;
	x=y;
	y=aux-y*q;
}

inline long long Combinari_de_2N_luate_cate_N()
{
	long long i,N2Fact=1,NFact=1,invNFact=0,aux=0,Final;
	for(i=2;i<=N;i++)
	{
		NFact*=i;
		NFact%=MOD;
		N2Fact*=i;
		N2Fact%=MOD;
	}
	for(i=N+1;i<=N2;i++)
	{
		N2Fact*=i;
		N2Fact%=MOD;
	}
	InversModular(NFact,MOD,invNFact,aux);
	invNFact%=MOD;
	if(invNFact<0)
		invNFact+=MOD;
	Final=N2Fact*invNFact;
	Final%=MOD;
	Final*=invNFact;
	Final%=MOD;
	return Final;
}

inline long long Combinari_de_2N_luate_cate_N_minus1()
{
	long long i,N2Fact=1,NFact1=1,NFact2=1,invNFact1=0,invNFact2=0,aux=0,Final;
	for(i=2;i<N;i++)
	{
		NFact1*=i;
		NFact1%=MOD;
		NFact2*=i;
		NFact2%=MOD;
		N2Fact*=i;
		N2Fact%=MOD;
	}
	for(i=N;i<=N+1;i++)
	{
		NFact2*=i;
		NFact2%=MOD;
		N2Fact*=i;
		N2Fact%=MOD;
	}
	for(i=N+2;i<=N2;i++)
	{
		N2Fact*=i;
		N2Fact%=MOD;
	}
	InversModular(NFact1,MOD,invNFact1,aux);
	aux=0;
	InversModular(NFact2,MOD,invNFact2,aux);
	invNFact1%=MOD;
	if(invNFact1<0)
		invNFact1+=MOD;
	invNFact2%=MOD;
	if(invNFact2<0)
		invNFact2+=MOD;
	Final=N2Fact*invNFact1;
	Final%=MOD;
	Final*=invNFact2;
	Final%=MOD;
	return Final;
}

inline long long Catalan()
{
	long long Final;
	Final=termen1-termen2;
	if(Final<0)
		Final+=MOD;
	return Final;
}

inline void Afisare()
{
	ofstream fout("dirichlet.out");
	fout<<sol<<"\n";
	fout.close();
}

int main()
{
	Citire();
	termen1=Combinari_de_2N_luate_cate_N();
	termen2=Combinari_de_2N_luate_cate_N_minus1();
	sol=Catalan();
	Afisare();
	return 0;
}