Cod sursa(job #3039294)

Utilizator vladth11Vlad Haivas vladth11 Data 28 martie 2023 13:07:43
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.09 kb
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")

using namespace std;
typedef long long ll;
typedef pair <ll, ll> pii;

const ll NMAX = 1000001;
const ll INF = (1LL << 60);
const ll nrbits = 17;
const ll MOD = 9973;

bool ciur[NMAX];
ll primes[NMAX];
ll cc = 0;
ll pp[NMAX];

ll lgput(ll n, ll p) {
    ll r = 1;
    if(p == MOD - 2 && pp[n] != 0)
        return pp[n];
    while(p) {
        if(p % 2) {
            r *= n;
            r %= MOD;
        }
        n *= n;
        n %= MOD;
        p /= 2;
    }
    if(MOD - 2 == p)
        pp[n] = r;
    return r;
}

int main() {
//#ifdef HOME
    ifstream cin("ssnd.in");
    ofstream cout("ssnd.out");
//#endif // HOME
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    ciur[1] = 1;
    for(ll i = 2; i * i < NMAX; i++) {
        if(ciur[i]) continue;
        for(ll j = i * i; j < NMAX; j += i)
            ciur[j] = 1;
    }
    for(ll i = 2; i < NMAX; i++) {
        if(!ciur[i]) {
            primes[++cc] = i;
        }
    }
    ll n, i;
    cin >> n;
    for(i = 1; i <= n; i++) {
        ll x;
        cin >> x;
        ll nr = 1;
        ll sum = 1;
        ll d = 1;
        while(d <= cc && 1LL * primes[d] * primes[d] <= x) {
            ll p = 0;
            while(x % primes[d] == 0) {
                p++;
                x /= primes[d];
            }
            if(p > 0) {
                nr *= (p + 1);
                nr %= MOD;
                sum *= (lgput(primes[d], p + 1) - 1 + MOD) % MOD;
                sum %= MOD;
                sum *= lgput(primes[d] - 1, MOD - 2);
                sum %= MOD;
            }
            d++;
        }
        if(x > 1) {
            ll p = 1;
            nr *= 2;
            nr %= MOD;
            sum *= (lgput(x % MOD, p + 1) - 1 + MOD) % MOD;
            sum %= MOD;
            sum *= lgput((x - 1) % MOD, MOD - 2);
            sum %= MOD;
        }
        cout << nr << " " << sum << "\n";
    }
}