Cod sursa(job #939998)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 15 aprilie 2013 12:55:03
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include<fstream>



using namespace std;

#define mod 9973
#define max_n 1000010 

ifstream f("ssnd.in");
ofstream g("ssnd.out");

int T , k;
long long Prim[100010] , Nr[1000];
bool Viz[max_n];
long long n , D[1000];


long long power(long long a , long long b);
long long inv_mod(long long a);

void ciur(){
	
	Prim[++k] = 2;
	
	int i , j;
	const int max_v = 1100;
	
	for( i = 3 ; i <= max_v ; i += 2 ){
		if(Viz[i] == 0){
			for(j = 2*i ; j < max_n ; j += i)
				Viz[j] = 1;
		}
	}
	
	for(i = 3 ; i <= max_n ; i += 2)
		if(Viz[i] == 0)
			Prim[++k] = i;
	
}

void descompunere(long long n , long long D[] , long long Nr[]){
	
	int i , nr; D[0] = 0;
	
	for( i = 1 ; i <= k && Prim[i] * Prim[i] <= n ; i++ ){
		
		if( n % Prim[i] == 0 ){
			
			nr = 0;
			
			while(n % Prim[i] == 0){
				n /= Prim[i];
				nr++;
			}
			
			D[++D[0]] = Prim[i];
			Nr[D[0]] = nr;
			
		}
		
	}
	
	if(n != 1){
		D[++D[0]] = n;
		Nr[D[0]] = 1;
	}
	
}

long long numar(long long D[] , long long Nr[]){
	
	long long total = 1;
	
	for(register int i = 1 ; i <= D[0] ; i++)
		total *= (Nr[i] + 1);
	
	return total;
}

long long suma(long long D[] , long long Nr[]){
	
	long long total = 1;
	
	for(register int i = 1 ; i <= D[0] ; i++){
		total *= ( ( ( power(D[i] , Nr[i] + 1) - 1 )*inv_mod(D[i] - 1) ) % mod ) ;
		total %= mod;
	}
	
	return total;
}

long long inv_mod(long long a){
	return power(a , mod - 2);
}

long long power(long long a , long long b){
	if(b == 0){
		return 1;
	}
	else{
		long long p = power(a , b / 2);
		if(b % 2 == 1)
			return ((((p*p)%mod)*a)%mod);
		else 
			return ((p*p)%mod);
	}
}

int main(){
	
	ciur();
	
	f>>T;
	
	while(T--){
		f>>n;
		descompunere(n , D , Nr);
		g<<numar(D , Nr);
		g<<" "<<suma(D , Nr)<<"\n";
	}
	
	return 0;
}