Cod sursa(job #687131)

Utilizator Addy.Adrian Draghici Addy. Data 22 februarie 2012 09:32:30
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <cstring>

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 (ll);

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

int pow (int a, int exp) {
	
	int sol = 1; int p = a;
	for (exp %= MOD; 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 (ll N) {
	
	ll M = N; int Y1, Y2, E; NR = 1; S = 1;
	for (int i = 1; i <= K && 1LL * P[i] * P[i] <= N; i++) {
		E = 0;
		while (M % (ll) P[i] == 0) {
			E++;
			M /= (ll) P[i];
		}
		if (E) {
			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 (M > 1) {
		NR = (NR << 1) % MOD;
		S = (1LL * S * (N + 1)) % MOD;
	}
}