Cod sursa(job #526832)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 29 ianuarie 2011 16:42:15
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>
#define Mod 9973
#define i64 unsigned long long
FILE*f=fopen("ssnd.in","r");
FILE*g=fopen("ssnd.out","w");

i64 T,k,i,pow,nrdiv,x,sdiv;
int Pr[1000000];
char Ciur[1000005];

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

i64 poww(i64 a,i64 n){
	i64 p = 1 ;
	while ( n != 0 ){
		if( n % 2 == 1 )
			p = p * a;
		a = a * a;
		n /= 2;
	}
	return p;
}

int main () {
	
	ciur();
	
	fscanf(f,"%lld",&T);
	while ( T-- ){
		fscanf(f,"%lld",&x);
		int x2 = x;
		nrdiv = sdiv = 1;
		for ( i = 1 ; Pr[i] * Pr[i] <= x2 && x != 1 && i <= k ; ++i ){
			pow = 0;
			while ( !(x % Pr[i] ) ){
				x /= Pr[i];
				++pow;
			}
			nrdiv = nrdiv * pow + nrdiv;
			sdiv = (sdiv * 1LL *( ( ( poww(Pr[i],pow + 1) - 1 ) / ( Pr[i] - 1 ) ) ) );
			
		}		
		
		if ( x != 1 ){
			nrdiv *= 2;
			sdiv = ( sdiv * ( x + 1 ) );
		}
		fprintf(g,"%lld ",nrdiv);
		fprintf(g,"%lld\n",sdiv%Mod);
		
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}