Cod sursa(job #641308)

Utilizator geniucosOncescu Costin geniucos Data 27 noiembrie 2011 20:12:32
Problema Dirichlet Scor 88
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include<stdio.h>
using namespace std;
long long r,p,nr,i,j,n,a[2000001],b[1000001],c[1000001];
long long vp(long long baz,long long fac)
{
	long long nr11,p1;
	nr11=0;
	p1=baz;
	while(1)
	{
		nr11=nr11+fac/p1;
		p1=p1*baz;
		if(p1>fac) break;
	}
	return nr11;
}
long long ridic(long long a1,long long b1)
{
	int aux;
	if(b1==0) return 1;
	else
	if(b1%3==1) return (ridic(a1,b1-1)*a1)%r;
	else
	if(b1%3==0)
	{
		aux=ridic(a1,b1/3);
		return ((aux*aux)%r*aux)%r;
	}
	else return ((ridic(a1,b1-2)*a1)%r*a1)%r;
}
int main()
{
freopen("dirichlet.in","r",stdin);
freopen("dirichlet.out","w",stdout);
scanf("%d",&n);
a[1]=1;
for(i=1;i<=2*n;i++)
	if(a[i]==0)
	{
		for(j=i*i;j<=2*n;j=j+i)
			a[j]=1;
	}
r=9999991;
for(i=1;i<=2*n;i++)
	if(a[i]==0)
	{
		nr++;
		b[nr]=i;
		c[nr]=vp(i,2*n)-vp(i,n)-vp(i,n+1);
	}
	p=1;
for(i=1;i<=nr;i++)
	p=(p*ridic(b[i],c[i]))%r;
printf("%lld",p);
return 0;
}