Cod sursa(job #2575186)

Utilizator BogdanRazvanBogdan Razvan BogdanRazvan Data 6 martie 2020 12:00:42
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>
#define mod 9973

using namespace std;

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

void usain_bolt()
{
    ios::sync_with_stdio(false);
    fin.tie(0);
}

const int N = 1e6 + 5;

vector < long long > prime;
bool composite[N];

void ciur()
{
    for(long long i = 2; i <= 1e6; ++i) {
        if(composite[i] == false) prime.push_back(i);
        for(int j = 0; j < prime.size() && i * prime[j] <= 1e6; ++j) {
            composite[i * prime[j]] = true;
            if(i % prime[j] == 0) break;
        }
    }
}

long long pwr(long long a, long long b)
{
    long long sol = 1;
    while(b > 0) {
        if(b & 1) sol = (sol * a) % mod;
        a = (a * a) % mod;
        b >>= 1LL;
    }
    return sol;
}

int main()
{
    usain_bolt();

    ciur();


    int tt;

    fin >> tt;
    for(; tt; --tt) {
        long long n, sum_divs = 1;
        long long divs = 1;

        fin >> n;
        for(int i = 0; i < prime.size() && 1LL * prime[i] * prime[i] <= n; ++i) {
            long long e = 0;
            if(n % prime[i] == 0) {
                while(n % prime[i] == 0) n /= prime[i], ++e;
            }
            divs *= (e + 1);
            if(e > 0) sum_divs = (sum_divs * (pwr(prime[i], e + 1) - 1) / (prime[i] - 1)) % mod;
        }
        if(n > 1) {
            divs *= 2;
            sum_divs = (sum_divs * (pwr(n, 2) - 1) / (n - 1)) % mod;
        }
        fout << divs << " " << sum_divs << "\n";
    }
    return 0;
}