Cod sursa(job #639634)

Utilizator geniucosOncescu Costin geniucos Data 23 noiembrie 2011 18:09:20
Problema Dirichlet Scor 4
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 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%2==1) return (ridic(a1,b1-1)*a1)%r;
	else
	{
		aux=ridic(a1,b1/2);
		return (aux*aux)%r;
	}
}
long long rid(long long x,long long m)
{
	int k,p2;
	p2=1;
	for(k=0;(1<<k)<=m;k++)
	{
		if((1<<k)&m>0) p2=(p2*x)%r;
		x=(x*x)%r;
	}
	return p2;
}
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*rid(b[i],c[i]))%r;
printf("%lld",p);
return 0;
}