Cod sursa(job #639641)

Utilizator geniucosOncescu Costin geniucos Data 23 noiembrie 2011 18:20:10
Problema Dirichlet Scor 88
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 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)
{
	long long p2;
	p2=1;
	while(b1>0)
	{
		if(b1%2==0)
		{
			a1=(a1*a1)%r;
			b1=b1/2;
		}
		else
		{
			p2=(p2*a1)%r;
			b1--;
		}
	}
	return p2;
}
int rid(int x,int b1)
{
	int j,p2;
	p2=1;
    //scanf("%d",&x);
    for(j=0;(1<<j)<=b1;j++)
    {
        if((b1&(1<<j))>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;
}