Cod sursa(job #457732)

Utilizator ncbllrNegrii Costin ncbllr Data 21 mai 2010 12:13:19
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<iostream.h>
#include<fstream.h>
#include<math.h>


int v[ 1002000 ];
int inv[ 10000 ];
int prime[400000]; 

void invers(long a, long b, long &d, long &x, long &y) 
{ 
    
    if (b == 0) 
       { 
        d = a; 
        x = 1; 
        y = 0; 
       }
    else 
       { 
        long x0, y0; 
        invers(b, a % b, d, x0, y0); 
        x = y0; 
        y = x0 - (a / b) * y0; 
       } 
} 





void prim(long long n, int &nr)
{
	long long j=2,i ;
	nr = 0;
	long p = sqrt( n ) ;
	prime[ ++nr ] = 2;
	j = 3;
	while(j  <= p)
	{
			if( v [ j ] != 1) 
			{
				for(i = j * j;i <= p;i += 2 * j)      v [ i ] = 1;         
				prime[ ++nr ] = j;
			}
			
			j += 2;
    }  
}


int main()

{
	freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
	
	
	long long n;
	
	int k, nr_prime = 0, cazuri,p=1,s,q;
	
	scanf("%d\n", &cazuri);
	prim( 1000000000000ll, nr_prime);
	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;
			
            long m,d,y,x;
            
			m = (prime[i] + 9972) % 9973;
			
            invers(m,9973,d,x,y); 
                             
			x = (x + 997300000) % 9973;
            q = q * x % 9973;			
			
		}	
		if( n > 1)
			p=(p*2) % 9973;
		printf("%d %d\n", p , q );
		--cazuri;
		
	}
	return 0;
}