Cod sursa(job #449399)

Utilizator ncbllrNegrii Costin ncbllr Data 6 mai 2010 12:19:44
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<iostream.h>
#include<fstream.h>


int v[ 1002000 ];
int inv[ 10000 ];
int prime[400000]; 
void prim(long long n, 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;         
				prime[ ++nr ] = j;
			}
			
			j++;
    }  
}
int inver( int i )
{ 
	
	if( inv[ i ] ) return inv[i];
		for( int j = 1; j < 9973; ++j)
			if( i *j % 9973 == 1)
				{   inv[ i] = j; inv[ j ] = i; return inv[i];}
    return 0;         
  }

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( 1000000, 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;
			m = (prime[i] + 9972) %9973;
            q=q*inver(m) %9973;			
			
		}	
		if( n > 1)
			p=p*2;
		printf("%d  %d\n", p , q );
		--cazuri;
		
	}
	return 0;
}