Cod sursa(job #822243)

Utilizator ahmed.abdraboahmed.abdrabo ahmed.abdrabo Data 23 noiembrie 2012 00:51:37
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <map>

using namespace std;

const int MOD = 9973;
const int MAX = 1 << 20;

bool P[MAX];
int primes[MAX];

int main() {
	ifstream cin("ssnd.in");
	ofstream cout("ssnd.out");
	for (int i = 2; i * i <= MAX; i++) {
		if (P[i] == 0) {
			for (int j = i * i; j < MAX; j += i) {
				P[j] = true;
			}
		}
	}
	for (int i = 2, j = 0; i < MAX; i++) {
		if (P[i] == 0) {
			primes[j++] = i;
		}
	}
	long long T, N;
	cin >> T;
	while (T--) {
		cin >> N;
		map<long long, int> mp;
		map<long long, long long> pow;
		for (int i = 0; 1LL * primes[i] * primes[i] <= N; i++) {
			if (N % primes[i] == 0) {
				pow[primes[i]] = primes[i];
				while (N % primes[i] == 0) {
					mp[primes[i]]++;
					N /= primes[i];
					pow[primes[i]] *= primes[i];
				}
			}
		}
		if (N > 1) {
			mp[N]++;
			pow[N] = N * N;
		}
		long long cnt = 1, sum = 1;
		for (map<long long, int>::iterator it = mp.begin(); it != mp.end(); it++) {
			cnt *= it->second + 1;
		}
		for (map<long long, long long>::iterator it = pow.begin(); it != pow.end(); it++) {
			sum = (sum * ((it->second - 1) / (it->first - 1))) % MOD;
		}
		cout << cnt << " " << sum << "\n";
	}
	return 0;
}