Cod sursa(job #2074652)

Utilizator savigunFeleaga Dragos-George savigun Data 24 noiembrie 2017 20:55:51
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
using namespace std;

ifstream in("ssnd.in");
ofstream out("ssnd.out");

const int MOD = 9973;
int t;
bool use[1000001];
vector<int> primes;

void ciur() {
    for (int i = 2; i <= 1e6; ++i) {
        if (!use[i]) {
            primes.push_back(i);
            for (int j = i + i; j <= 1e6; j += i) use[j] = true;
        }
    }
}

int pow(int a, int n) {
    if (n == 0) return 1;
    a %= MOD;
    if (n % 2 == 0) return pow((a * a), n / 2) % MOD;
    return (a * pow(a, n - 1)) % MOD;
}

void solve(long long n) {
    long long sum = 1;
    long long nd = 1;

    int i = 0;

    while ((long long)primes[i] * primes[i] <= n) {
        if (n % primes[i]) {
            i++;
            continue;
        }

        int ap = 0;
        long long p = 1;

        while (n % primes[i] == 0) {
            n /= primes[i];
            ap++;
            p *= primes[i];
        }

        nd *= ap + 1;
        p *= primes[i];
        sum *= (p - 1) / (primes[i] - 1);
        sum %= MOD;

        i++;
    }

    if (n > 1) {
        nd *= 2;
        sum = (sum * (n + 1)) % MOD;
    }

    out << nd << " " << sum << "\n";
}

int main()
{
    ciur();

    in >> t;
    while (t--) {
        long long n;
        in >> n;
        solve(n);
    }

    return 0;
}