Cod sursa(job #406951)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 1 martie 2010 22:03:49
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<stdio.h>
#include<string.h>
#define Ld 1000000
#define MOD 9973
#define divizori 80000
using namespace std;
int t,T,i,n,prim[divizori],ciur[Ld+1],P,exp,Nr,x;
long long Sum,a,S;

void precalc()
{
	int i,j;
	
	for(i=2;i<=Ld;i++)
		if(!ciur[i])
		{
			prim[++P]=i;
			for(j=i+i;j<=Ld;j+=i)
				ciur[j]=1;
		}
}

int lgput (int a, int b)
{
	int S;
	a%=MOD;
	for(S=1;b;a=(a*a)%MOD,b>>=1)
		if(b&1) S=(S*a)%MOD;
	
	return S;
}

int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	
	scanf("%d",&T);
	
	precalc();
	
	for(t=1;t<=T;t++)
	{
		scanf("%d",&n);
		
		Nr=Sum=1;
		for(i=1; prim[i] * prim[i] <= n; i++)
			if(n%prim[i]==0)
			{
				x=prim[i];
				exp=1;
//				a=x; S=1;
				while(n%x==0)
				{
					exp++;
					//S=(S+a)%MOD;
					//a=(a*x)%MOD;
					n/=x;
				}
				Nr*=exp;
				//Sum=(Sum*S)%MOD;
				Sum=(Sum*(lgput(x,exp)-1)/(x-1))%MOD;
			}
		if(n!=1) { Nr<<=1; Sum=(Sum*(lgput(n,2)-1)/(n-1))%MOD; }
		/*{
			Nr<<=1;
			Sum=( Sum * (n*n-1)/(n-1) ) %MOD;
		}
		*/
		printf("%d %lld\n",Nr,Sum);
	}
	return 0;
}