Cod sursa(job #883564)

Utilizator RobertSSamoilescu Robert RobertS Data 20 februarie 2013 10:01:34
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
const int MAX_N = 1000005;
const int MOD = 9973;

ifstream fin ("ssnd.in"); 
ofstream fout ("ssnd.out");

struct pereche{
	int div, nr;
	pereche(){
	 nr = 0;
	}
};

int t;
bool prim[MAX_N];
vector<long>vec;
vector<pereche> divizori;

//---==== PENTRU DETERMINAREA NUMERELOR PRIME ===----//
void ciur(){
	prim[1] = true;
	for(int i=2; i<=MAX_N; i++){
		if(!prim[i]){
			vec.push_back(i);
			for(int j=i; j<=MAX_N; j+=i)
				prim[j] = true; 
		}
	}
}


inline int pow(int x, int p) {
    int rez = 1;
    x %= MOD;
 
    for(; p; p >>= 1) {
        if(p & 1) {
            rez *= x;
            rez %= MOD;
        }
 
        x *= x;
        x %= MOD;
    }
 
    return rez;
}


void solve(long n){
	for(size_t i=0; i<vec.size(); i++){
		if(n%vec[i] == 0){
			pereche p; p.div = vec[i];
			while(n%vec[i] == 0){
				p.nr ++;
				n/= vec[i];
			}
			divizori.push_back(p);
		}
	}
	
	long nr_div = 1;
	long suma_div = 1;
	for(size_t i=0; i<divizori.size(); i++){
		nr_div *= divizori[i].nr+1;
		int x = pow(divizori[i].div, divizori[i].nr+1);
		suma_div *= (x - 1)/(divizori[i].div -1);
	}
	
	fout << nr_div << " " <<(long)suma_div % MOD<< '\n';
	divizori.clear();
}


int main(){

	
	ciur();
	fin >> t;
	for(int i=1; i<=t; i++){
		long n; fin >> n;
		solve(n);
	}
	

return 0;
}