Cod sursa(job #939983)

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



using namespace std;

#define mod 9973
#define max_n 1000010 

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

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

int power(int a , int b);
int inv_mod(int 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(int n , int D[] , int 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;
	}
	
}

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

int suma(int D[] , int 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;
}

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

int power(int a , int b){
	if(b == 0){
		return 1;
	}
	else{
		int 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;
}