Cod sursa(job #2982086)

Utilizator Elvis_CostinTuca Elvis-Costin Elvis_Costin Data 19 februarie 2023 15:21:13
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.38 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
string np = "ssnd";
ifstream f(np + ".in");
ofstream g(np + ".out");

// #define f cin
// #define g cout

ll n, len;
const ll mod = 9973;
bool ciur[1000003];
vector<ll> v(1000003);

void build_ciur()
{
    for (ll i = 2; i < 1000000; i++)
        if (!ciur[i])
        {
            v[++len] = i;
            for (ll j = i + i; j < 1000000; j += i)
                ciur[j] = 1;
        }
}
ll fastpow(ll a, ll b)
{
    a %= mod, b %= mod;
    long long rez = 1;
    while (b)
    {
        if (b % 2 == 1)
            rez = (1LL * rez * a) % mod;
        a = (1LL * a * a) % mod;
        b /= 2;
    }
    return rez;
}
void solve(ll n)
{
    ll nrdiv = 1, sumadiv = 1;
    for (ll i = 1; i <= len and 1LL * v[i] * v[i] <= n; i++)
    {
        if (n % v[i])
            continue;
        ll c = 0;
        while (n % v[i] == 0)
            n /= v[i], c++;
        nrdiv *= (c + 1);
        ll p1 = (fastpow(v[i], c + 1) - 1) % mod;
        ll p2 = fastpow(v[i] - 1, mod - 2) % mod;
        sumadiv = (((sumadiv * p1) % mod) * p2) % mod;
    }
    if (n > 1)
        nrdiv *= 2, sumadiv = (1LL * sumadiv * (n + 1) % mod);
    g << nrdiv << " " << sumadiv << '\n';
}
int main()
{
    build_ciur();

    ll t;
    f >> t;
    while (t--)
        f >> n, solve(n);

    return 0;
}