Cod sursa(job #406043)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 1 martie 2010 09:17:49
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>

#define file_in "ssnd.in"
#define file_out "ssnd.out"

#define Mod 9973



int T,N,i,inv[1000000],e,d,nrd,suma,p;

int prim(int X)
{
	if (X==1)
		return 0;
	if (X==2) 
		return 1;
	
	int dd=0;
	for (int i=1;i<=X;++i)
		 if (X%i==0)
              dd++; 
    if (dd==2)
		return 1;
    return 0;
}

int my_pow(int a,int b)
{
    int t;
    
    if (!b) 
		return 1;
    t=my_pow(a,b>>1);
    t=(t*t)%Mod;
    if (b&1)
		t=(t*a)%Mod;
    return t;
}


int main()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	
	scanf("%d", &T);
	
	for (i=1;i<Mod;++i)
        inv[i]=my_pow(i,Mod-2);

	
	while(T--)
	{
		scanf("%d", &N);
		
		if (prim(N))
		{
			printf("2 %d\n", N+1);
		}
		else
		{
					
		
		suma=1;
		nrd=1;
		
		e=0;
		while(N%2==0)
		{
			N/=2;
			e++;
		}
		
		if (e>0)
		{
			nrd=(e+1);
			p=1;
			for (i=1;i<=e+1;++i)
				 p*=2;
			p--;
			p=(p*inv[1])%Mod;
			suma=p;
        }
		
		
		d=3;
		while(N!=1)
		{
			e=0;		
		while(N%d==0)
		{
			N/=d;
			e++;
		}
		
		if (e>0)
		{
			nrd*=(e+1);
			p=1;
			for (i=1;i<=e+1;++i)
				 p*=d;
			p--;
			for (i=1;i<d;++i)
            p=(p*inv[i])%Mod;
			suma*=p;
        }
		d+=2;
		}
		
		printf("%d %d\n", nrd,suma);
		}
	}
	
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}