Cod sursa(job #491141)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 9 octombrie 2010 21:35:02
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include<cstdio>
long long n;
int N=1000005,t,pr,p[1000005],m=9973,exp(int,int);
void read(),solve(),ciur();
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	scanf("%d",&t);
}
void solve()
{
	int cnt,nd,sd,i;
	ciur();
	for(;t;t--)
	{
		scanf("%lld",&n);
		for(nd=1,sd=1,i=1;i<=pr&&p[i]*p[i]<=n;i++)
		{
			if(n%p[i])continue;
			for(cnt=0;n%p[i]==0;n/=p[i],++cnt);
			nd*=(cnt+1);
			sd =((((sd*exp(p[i],cnt+1)-1))%m)*exp(p[i]-1,m-2))%m;
		}
		if(n>1)
		{
			nd*=2;
			sd=(sd*(n+1))%m;
		}
		printf("%d %d\n",nd,sd);
	}
}	
int exp(int b, int e){int ret=1;for(;e;e>>=1,b*=b,b%=m)if(e&1)ret*=b,ret%=m;return ret;}
void ciur()
{
	int i, j;
	for(i=2;i<1000;i++)
		if(!p[i])
		{
			p[++pr]=i;
			for(j=i*i;j<1000000;j+=i,p[j]=1);
		}
	for(i=1001;i<1000000;i++)
		if(!p[i])
			p[++pr]=i;	
}