Cod sursa(job #429400)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 30 martie 2010 09:12:27
Problema Suma si numarul divizorilor Scor 60
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,i,prim[divizori],ciur[Ld+10],P,e,Nrdiv,d;
long long Sum,n;

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

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

int main()
{
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout);
	
	precalc();
	
	scanf("%d",&T);
	
	while(T--)
	{
		scanf("%lld",&n);
		
		Nrdiv=1; Sum=1;
		for(d=1; 1ll*prim[d]*prim[d]<=n; d++)
		{
			if(n%prim[d]==0)
			{
				e=1; 
				while(n%prim[d]==0 && n>1)
				{
					e++;
					n/=prim[d];
				}
				Nrdiv*=e;
				Sum*= ( ( lgput(prim[d],e)-1 ) % MOD );
				Sum%=MOD;
				Sum*= (  lgput(prim[d]-1,MOD-2) %MOD );
				Sum%=MOD;
			}
		}
		if(n>1)
		{
			Nrdiv<<=1;
			Sum*= ( ( n*n-1 ) %MOD );
			Sum%=MOD;
			Sum*= (  lgput(n-1,MOD-2)  %MOD );
			Sum%=MOD;
		}
		printf("%d %lld\n",Nrdiv,Sum);
	}
return 0;
}