Cod sursa(job #455736)

Utilizator ncbllrNegrii Costin ncbllr Data 14 mai 2010 09:23:39
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<iostream.h>
#include<fstream.h>
#include<math.h>


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

void invers(int a, int b, int &d, int &x, int &y) 
{ 
    
    if (b == 0) 
       { 
        d = a; 
        x = 1; 
        y = 0; 
       }
    else 
       { 
        int 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;
			int m,d,y,x;
			m=(prime[i]+9972)%9973;
            invers(m,9973,d,x,y); 
            while ( x < 0)  x = x + 9973;
            q=q*x %9973;			
			
		}	
		if( n > 1)
			p=(p*2) % 9973;
		printf("%d  %d\n", p , q );
		--cazuri;
		
	}
	return 0;
}