Cod sursa(job #3240305)

Utilizator prares06Papacioc Rares-Ioan prares06 Data 14 august 2024 00:22:08
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include<bits/stdc++.h>
using namespace std;

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

const int MOD = 9973;
const int MAX = 1e6;
int64_t t, n;
bitset<MAX + 5> c;
vector<int64_t> primes;

int64_t lgput(int64_t base, int64_t exp){
    int64_t res = 1;
    while(exp){
        if(exp & 1)
            res = (res * base) % MOD;
        base = (base * base) % MOD;
        exp >>= 1;
    }
    return res;
}

void compute_sieve(){
    c[0] = c[1] = true;

    for(int i = 1; i <= 1000; ++i)
        if(!c[i])
            for(int j = i; j * i <= MAX; ++j)
                c[i * j] = true;

    primes.push_back(2);

    for(int64_t i = 3; i <= MAX; i += 2)
        if(!c[i])
            primes.push_back(i);
}

void solve_query(){
    int64_t n, sus = 1, jos = 1, nrdiv = 1;

    fin >> n;

    for(int64_t x : primes){
        int64_t cnt = 0;
        if(x * x > n)
            break;
        while(n % x == 0){
            n /= x;
            ++cnt;
        }
        nrdiv = (nrdiv * (cnt + 1)) % MOD;
        if(cnt){
            jos = (jos * (x - 1)) % MOD;
            int64_t p = lgput(x, cnt + 1);
            p = (p + MOD - 1) % MOD;
            sus = (sus * p) % MOD;
        }
    }

    if(n != 1){
        nrdiv = (nrdiv * 2) % MOD;
        jos = (jos * (n - 1)) % MOD;
        int64_t p = lgput(n, 2);
        p = (p + MOD - 1) % MOD;
        sus = (sus * p) % MOD;
    }

    jos = lgput(jos, MOD - 2);

    fout << nrdiv << ' ' << (sus * jos) % MOD << '\n';
}

int main(){
    compute_sieve();
    fin >> t;
    for(;t--;)
        solve_query();
}