Cod sursa(job #637736)

Utilizator HakunaMatataA.A.A. HakunaMatata Data 20 noiembrie 2011 16:10:06
Problema Dirichlet Scor 44
Compilator cpp Status done
Runda .com 2011 Marime 1.18 kb
#include<stdio.h>
#define MOD  9999991
#define CMAX 1000000

int A[CMAX],B[CMAX];

void mul(int B)
{
      int i, t = 0;
      for (i = 1; i <= A[0] || t; i++, t /= 10)
              A[i] = (t += A[i] * B) % 10;
      A[0] = i - 1;
}

void div(int B)
{
      int i, t = 0;
      for (i = A[0]; i > 0; i--, t %= B)
              A[i] = (t = t * 10 + A[i]) / B;
      for (; A[0] > 1 && !A[A[0]]; A[0]--);
}

long long mod(int B)
{
      int i, t = 0;
      for (i = A[0]; i > 0; i--)
              t = (t * 10 + A[i]) % B;
      return t;
}

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

	int N;
	scanf("%d",&N);
	/*
	unsigned long long p1,p2;
	unsigned long long ans2=1;
	for(p2=N+2,p1=2; p2<=(N<<1); ++p2)
	{
		if( !(p2&1) )
			ans2= (ans2<<1);
		else
			ans2= (ans2*p2);

		while( ans2>MOD && p1*2<N+2 && ans2%p1==0 )
			ans2/=p1++;
	}

	for(p1; p1*2<N+2; ++p1 )
		ans2/=p1;

	printf("%lld\n",ans2%MOD);
	*/
	
	long long p1=1,p2=N;
	A[0]=1;A[1]=1;
	for( p2=2*N; p2>N+1; --p2 )
	{	
		if( !(p2&1) )
			mul(2);
		else
			mul(p2);
	}
	
	for(p1; p1*2<N+2; ++p1 )
		div(p1);
	
	printf("%lld\n",mod(MOD));
	
	return 0;
}