Cod sursa(job #492385)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 14 octombrie 2010 13:03:20
Problema Suma si numarul divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<stdio.h>
#define Ld 1000000
#define MOD 9973
#define divizori 80010
using namespace std;
int T,i,prim[divizori],ciur[Ld+10],P,e,d;
int Sum,Nrdiv;
long long 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;
		}
}

int lgput(int a,int b)
{
	int 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; prim[d]<=n && d <= 80000; 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 ) ;
				Sum%=MOD;
				Sum *=  lgput(prim[d]-1,MOD-2) ;
				Sum%=MOD;
			}
		}
		if(n>1)
		{
			Nrdiv<<=1;
			Sum *=  ( n*n-1 );
			Sum%=MOD;
			Sum *=  lgput((int)n-1,MOD-2) ;
			Sum%=MOD;
		}
		printf("%d %d\n",Nrdiv,Sum);
	}
return 0;
}