Cod sursa(job #445259)

Utilizator ncbllrNegrii Costin ncbllr Data 23 aprilie 2010 11:54:57
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<iostream.h>
#include<fstream.h>

int v[ 1002000 ];
int inv[ 10000 ];
void prim(long long n, int *primes, int &nr)
{ long long j=2,i ;
nr = 0;
	while(j * j <= n)
	{
			if( v [ j ] != 1) 
			{
				for(i = j;i * i <= n;i += j)      v [ i ] = 1;         
				primes[ ++nr ] = j;
			}
			
			j++;
    }  
}


int main()

{
	freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
	
	//int n;
	long long n;
	int prime[100000]; 
	int k, nr_prime, cazuri,p=1,s,q;
	prim(100000000000ll, prime, nr_prime);
	
	for( int i = 1; i < 9973; ++i)
	{
		if( inv[ i ] ) continue;
		for( int j = 1; j < 9973; ++j)
			if( i *j % 9973 == 1)
			{	inv[ i] = j; inv[ j ] = i; break;}
			
	}
	scanf("%d\n", &cazuri);
	while( cazuri )
	{
		p = 1; q = 1;
		scanf("%lld", &n);
		for (int i = 1; i <= nr_prime && n > 1; i ++)
		{
			k =0;
			while( n % prime[i] == 0) 
			{
				n = n / prime[i];
				k++;
			}
			p=p*(k+1);
			s = 1;
			for(int j=1;j<=k+1;j++)
	            s=(s*prime[i])%9973;
			s= (s +9972) %9973 ;
			q=(q*s) % 9973 *inv[(prime[i] + 9972)% 9973];
            q=q%9973;			
			
		}	
		if( n > 1)
			p=p*2;
		printf("%d  %d\n", p , q );
		--cazuri;
		
	}
	return 0;
}