Cod sursa(job #3120930)

Utilizator AlexCroitoriuAlex Croitoriu AlexCroitoriu Data 9 aprilie 2023 14:05:30
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;
fstream f("ssnd.in", ios::in), g("ssnd.out", ios::out);
bool v[1000001];
vector<int> primes;
typedef long long ll;
#define MOD 9973
ll fastexp(ll base, ll exp)
{
    ll ans = 1;
    for (ll k = 1; k <= exp; k <<= 1)
    {
        if (k & exp)
            ans = ans * base % MOD;
        base = base * base % MOD;
    }
    return ans;
}
int main()
{
    int q;
    f >> q;
    v[0] = v[1] = 1;
    for (int i = 1; i <= 1000; i++)
        if (!v[i])
            for (int j = i * i; j <= 1000000; j += i)
                v[j] = 1;
    for (int i = 1; i <= 1000000; i++)
        if (!v[i])
            primes.push_back(i);
    while (q--)
    {
        int ans = 1, wer = 1;
        ll x;
        f >> x;
        int d = 0;
        while (x != 1)
        {
            int p = primes[d], cur = 1, e = 0;
            if (p * p > x)
            {
                ans = ans * 2 % MOD;
                cur = (x * x % MOD + MOD - 1) % MOD;
                wer = wer * cur % MOD * fastexp(x - 1, MOD - 2) % MOD;
                break;
            }
            while (x % p == 0)
                x /= p, e++;
            if (e)
            {
                ans = ans * (e + 1) % MOD;
                cur = (fastexp(p, e + 1) + MOD - 1) % MOD;
                wer = wer * cur % MOD * fastexp(p - 1, MOD - 2) % MOD;
            }
            d++;
        }
        g << ans << ' ' << wer << '\n';
    }
}