Cod sursa(job #1198808)

Utilizator howsiweiHow Si Wei howsiwei Data 17 iunie 2014 11:22:23
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
const int mod = 9973;

vector<int> gen_primes(int n)
{
	vector<bool> sieve(n+1, true);
	vector<int> primes;
	for (int p = 2; p <= n; p++) {
		if (!(sieve[p])) {
			continue;
		}
		primes.push_back(p);
		for (int i = 2*p; i <= n; i += p) {
			sieve[i] = false;
		}
	}
	return primes;
}

pair<int, int> num_sum_divisors(long long n, const vector<int> & primes)
{
	int num = 1;
	int sum = 1;
	int sqrtn = sqrt(n);
	for (auto p: primes) {
		if (p > sqrtn) {
			break;
		}
		if (n%p != 0) {
			continue;
		}
		int subnum = 1;
		int subsum = 1;
		do {
			subnum++;
			subsum *= p%mod;
			subsum++;
			subsum %= mod;
			n /= p;
		} while (n%p == 0);
		num *= subnum;
		num %= mod;
		sum *= subsum;
		sum %= mod;
		sqrtn = sqrt(n);
	}
	if (n != 1) {
		num *= 2;
		num %= mod;
		sum *= (1+n)%mod;
		sum %= mod;
	}
	return {num, sum};
}

int main()
{
	ios::sync_with_stdio(false);
	freopen("ssnd.in", "r", stdin);
	freopen("ssnd.out", "w", stdout);
	vector<int> primes = gen_primes(1e6);
	int ntest;
	cin >> ntest;
	for (int test = 0; test < ntest; test++) {
		long long n;
		cin >> n;
		auto res = num_sum_divisors(n, primes);
		printf("%d %d\n", res.first, res.second);
	}
	return 0;
}