Cod sursa(job #2575240)

Utilizator BogdanRazvanBogdan Razvan BogdanRazvan Data 6 martie 2020 12:23:35
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 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(int i = 2; i <= 1e6; ++i) {
        if(composite[i] == false) prime.push_back(1LL * 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, int b)
{
    long long sol = 1;
    while(b > 0) {
        if(b & 1) sol = (sol * a);
        a = (a * a);
        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() && prime[i] * prime[i] <= n; ++i) {
            int e = 0;
            if(n % prime[i] == 0) {
                while(n % prime[i] == 0) n /= prime[i], ++e;
            }
            divs *= (e + 1);
            if(e > 0) {
                ++e;
                sum_divs = (sum_divs * ((pwr(prime[i], 1LL * e) - 1) / (prime[i] - 1))) % mod;
            }
        }
        if(n > 1) {
            divs *= 2;
            sum_divs = (sum_divs * ((pwr(n, 2LL) - 1) / (n - 1))) % mod;
        }
        fout << divs << " " << sum_divs << "\n";
    }
    return 0;
}