Cod sursa(job #687147)

Utilizator Addy.Adrian Draghici Addy. Data 22 februarie 2012 09:48:19
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <bitset>

using namespace std;

#define MOD 9973
#define MAX 1000000
#define ll long long

int P[MAX], T, K, S, NR;
ll N;
bitset <MAX> B;

int pow (int, int);
void ciur (), descompunere ();

int main () {
	
	ifstream f ("ssnd.in");
	ofstream g ("ssnd.out");
	
	ciur ();
	
	f >> T;
	
	for ( ; T; T--) {
		f >> N;
		
		descompunere ();
		
		g << NR << " " << S << "\n";
	}
	
	return 0;
}

int pow (int a, int exp) {
	
	exp %= MOD; a %= MOD;
	int sol = 1; int p = a;
	for ( ; exp; exp >>= 1) {
		if (exp & 1)
			sol = (sol * p) % MOD;
		
		p = (p * p) % MOD;
	}
	
	return sol;
}

void ciur () {
	
	int i, j;
	for (i = 2; i <= MAX; i++)
		if (!B[i]) {
			P[++K] = i;
			for (j = 2 * i; j <= MAX; j += i)
				B[j] = 1;
		}
}

void descompunere () {
	
	int Y1, Y2, E;
	
	NR = 1; S = 1;
	for (int i = 1; i <= K && 1LL * P[i] * P[i] <= N; i++) {
		
		if (N % P[i]) continue;
		
		int E = 0;
		while (N % P[i] == 0) {
			E++;
			N /= P[i];
		}
		
		NR *= (E + 1);
		
		Y1 = (pow (P[i], E + 1) - 1) % MOD;
		Y2 = pow (P[i] - 1, MOD - 2);
		
		S = (((S * Y1) % MOD) * Y2) % MOD;
	}
	
	if (N > 1) {
		NR = (NR << 1) % MOD;
		S = (1LL * S * (N + 1)) % MOD;
	}
}