Cod sursa(job #1014256)

Utilizator The_DisturbedBungiu Alexandru The_Disturbed Data 22 octombrie 2013 13:13:04
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<stdio.h>
#include<math.h>
int n,i,j,p[100013],np,y,nr;
long long x,nrd,sd;
bool k[1000013];
bool da;
inline int pow(int a, int b)
{
	if(b==0)return 1;
	long long x=a,y=1;
	while(b!=1)
		if(b%2==0) x=(x*x)%9973,b/=2;
		else y=(x*y)%9973,--b;
	return(x*y)%9973;
}
int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	scanf("%d",&n);
	for(i=2;i<100000;++i)k[i]=1;
	for(i=2,np=0;i<100000;++i)if(k[i]){for(j=i;i*j<100000;++j) k[i*j]=0;p[np++]=i;}
	/*p[0]=2;
	p[1]=3;
	p[2]=5;
	np=3;
	x=7;
	while(x<100013)
	{
		da=1;
		for(i=0;i<np;++i)if(x%p[i]==0){da=0;break;}
		if(da)p[np++]=x;
		x+=2;
	}*/
	for(int q=0;q<n;++q)
	{
		scanf("%lld",&x);
		nrd=sd=1;
		y=(int)sqrt(x);
		for(i=0;p[i]<=y+1;++i)
		{
			nr=0;
			while(x%p[i]==0) x/=p[i],++nr;
			if(nr==0)continue;
			nrd*=(nr+1);
			sd*=((pow(p[i],nr+1)-1)/(p[i]-1));
		}
		if(x!=1)nrd=(nrd*2)%9973,sd=(sd*(x+1))%9973;
		printf("%lld %lld\n",nrd,sd);
	}
	return 0;
}