Cod sursa(job #406103)

Utilizator GotenAmza Catalin Goten Data 1 martie 2010 10:34:55
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<fstream.h>
#include<math.h>
#define p 9973
char v[1000000];
int w[100000],s[100000],e[100000];
int exp(int n, int ex)
{
	int i,r=1;
	for(i=0;(1<<i)<=ex;i++)
	{
		if((1<<i)&ex)
			r=(r*n)%p;
		n=(n*n)%p;
	}
	return (r-1)%p;
}	
int eu(int a, int b, int &x, int &y)
{
	if(b==0)
	{
		x=1;
		y=0;
		return a;
	}
	int d,x0,y0;
	d=eu(b,a%b,x0,y0);
	x=y0;
	y=x0-(a/b)*y0;
	return d;
}
int inv(int a)
{
	int x,y;
	if(p>a)
		eu(p,a,x,y);
	else
		eu(a,p,y,x);
	while(y<0)y+=p;
	while(y>p)y-=p;
	return y;
 }
int main()
{
	bool gasit;
	int n=1000000,nn=1000,t,a,b,d,c,i,nr,pp;
	ifstream f("ssnd.in");
	ofstream g("ssnd.out");
	f>>t;
	w[++w[0]]=2;
	d=3;
	while(d<=n)
	{
		w[++w[0]]=d;
		if(d<=nn)
		{
			a=d*d;
			b=(d<<1);
			while(a<=n)
			{
				c=(a>>1);
				if(!v[c])
					v[c]=1;
				a+=b;
			}
		}
		gasit=0;
		c=(d>>1)+1;
		while(!gasit)
		{
			if(!v[c])
			{
				d=(c<<1)+1;
				gasit=1;
			}
			else c++;
		}
	}
	while(t--)
	{
		f>>n;
		i=1;
		while(w[i]*w[i]<=n)
		{
			if(n%w[i]==0)
			{
				s[++s[0]]=w[i];
				while(n%w[i]==0)
				{
					n/=w[i];
					e[s[0]]++;
				}
			}
			i++;
		}
		if(n>1)
		{
			s[++s[0]]=n;
			e[s[0]]=1;
		}	
		nr=1;
		for(i=1;i<=s[0];i++)
			nr=nr*(e[i]+1)%p;
		g<<nr<<' ';
		pp=1;
		for(i=1;i<=s[0];i++)
			pp=pp*exp(s[i],e[i]+1)%p;
		for(i=1;i<=s[0];i++)
			pp=pp*inv(s[i]-1)%p;
		g<<pp<<'\n';
		for(i=1;i<=s[0];i++)
			e[i]=s[i]=0;
		e[0]=s[0]=0;
	}
	return 0;
}