Pagini recente » Cod sursa (job #1312654) | Cod sursa (job #3229617) | Cod sursa (job #3294075) | Cod sursa (job #2107200) | Cod sursa (job #2377777)
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int prime_numbers[80000];
int nr_primes = 0;
struct prime_factor {
int factor;
int exponent;
}factors[80000];
int nr_factors;
void calculate_prime_factors_of(long long n) {
nr_factors = 0;
for(int i = 1, d = prime_numbers[1]; d * d <=n; d = prime_numbers[++i]) {
if(n % d == 0) {
factors[++nr_factors].factor = d;
factors[nr_factors].exponent = 0;
while(n % d == 0) {
n /= d;
factors[nr_factors].exponent++;
}
}
}
if(n != 1) {
factors[++nr_factors].factor = n;
factors[nr_factors].exponent = 1;
}
}
void calculate_primes() {
bool *is_prime = new bool[1000001];
for(int i = 2; i <= 1000000; i++)
is_prime[i] = true;
is_prime[0] = is_prime[1] = false;
for(int i = 2; i <= 1000; i++)
if(is_prime[i])
for(int j = i * i; j <= 1000000; j += i)
is_prime[j] = false;
for(int i = 2; i <= 1000000; i++)
if(is_prime[i])
prime_numbers[++nr_primes] = i;
delete is_prime;
}
long long power_function(int base, int exponent) {
long long result = 1;
for(; exponent; exponent--)
result *= base;
return result;
}
int main()
{
calculate_primes();
int t;
fin >> t;
for(; t; t--) {
long long n;
fin >> n;
calculate_prime_factors_of(n);
int nr_of_divisors = 1;
for(int i = 1; i <= nr_factors; i++)
nr_of_divisors *= factors[i].exponent + 1;
int sum_of_divisors = 1;
for(int i = 1; i <= nr_factors; i++) {
sum_of_divisors *= (power_function(factors[i].factor, factors[i].exponent + 1) - 1) / (factors[i].factor - 1) % 9973;
sum_of_divisors %= 9973;
}
fout << nr_of_divisors << ' ' << sum_of_divisors << '\n';
}
fin.close();
fout.close();
return 0;
}