Cod sursa(job #580444)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 13 aprilie 2011 08:37:05
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<stdio.h>

#define MOD 9973
#define I64 long long

FILE*f=fopen("ssnd.in","r");
FILE*g=fopen("ssnd.out","w");

int Pr[80000],k,i,j,t,sdiv,ndiv,p; I64 n;
char Ciur[1000005];

inline void ciur () {
	
	Pr[++k] = 2;
	for ( i = 3 ; i <= 1000000 ; i += 2 ){
		if ( !Ciur[i] ){
			for ( j = i + i + i ; j <= 1000000 ; j += (i<<1) ){
				Ciur[j] = 1;
			}
			Pr[++k] = i;
		}
	}
	
}

inline int lgput ( int a, int b ){
	int s = a; int rez = 1;
	
	while ( b ){
		if ( b & 1 ){
			rez = (rez * s) % MOD;
		}
		
		s = (s * s) % MOD;
		
		b = b >> 1;
	}
	
	return rez;
	
}

int main () {
	
	fscanf(f,"%d",&t);
	
	ciur();
	
	while ( t-- ){
		
		fscanf(f,"%lld",&n);
		
		ndiv = sdiv = 1;
		
		for ( i = 1 ; Pr[i] * Pr[i] <= n && n > 1 ; ++i ){
			p = 0;
			if ( !(n % Pr[i] ) ){
				while ( !(n % Pr[i]) ){
					++p;
					n /= Pr[i];
				}
				ndiv = ndiv * (p + 1);
				sdiv = (sdiv * (lgput(Pr[i],p+1) - 1) * lgput((Pr[i]-1),MOD-2)) % MOD;
			}
			
		}
		
		if ( n > 1 ){
			ndiv = ndiv << 1;
			sdiv = (sdiv * ((n * n) - 1) * lgput (n-1,MOD-2)) % MOD; 
		}
		
		fprintf(g,"%d %d\n",ndiv,sdiv);
		
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}