Cod sursa(job #2599796)

Utilizator CharacterMeCharacter Me CharacterMe Data 11 aprilie 2020 19:06:59
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <bits/stdc++.h>
#define MOD 9973

using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
typedef long long ll;

int t, l;
int pown[15], invmod[10000];
ll n, sol1, sol2;
vector<int> primes;
pair<int, int> decomposition[15];
bitset<1000005> sieve;

void decompose(ll val);
int calcinv(int val);

int main()
{

    for(int i = 2; i <= 1000000; ++i){
        if(!sieve[i]){
            primes.push_back(i);

            for(int j = 2 * i; j <= 1000000; ++j) sieve[j] = true;
        }
    }

    for(int i = 1; i < 9973; ++i) invmod[i] = calcinv(i);

    fin >> t;
    while(t--){
        fin >> n;
        sol1 = sol2 = 1;

        decompose(n);

        for(int i = 1; i <= l; ++i){
            sol1 = (sol1 * (decomposition[i].second + 1)) % MOD;

            sol2 = (sol2 * invmod[(decomposition[i].first - 1) % MOD]) % MOD;

            int mult = 1;
            for(int j = 1; j <= decomposition[i].second + 1; ++j) mult = (mult * decomposition[i].first) % MOD;
            --mult;
            if(mult < 0) mult += MOD;

            sol2 = (sol2 * mult) % MOD;

        }

        fout << sol1 << " " << sol2 << "\n";

    }

    return 0;
}

void decompose(ll val){
    l = 0;

    for(auto it:primes){
        if(1LL * it * it > val) break;

        if(!(val % it)){
            decomposition[++l] = {it, 0};

            while(!(val % it)){
                ++decomposition[l].second;
                val /= it;
            }
        }
    }

    if(val > 1) decomposition[++l] = {val, 1};
}

int calcinv(int val){
    pown[0] = val;
    for(int i = 1; i < 15; ++i) pown[i] = (pown[i - 1] * pown[i - 1]) % MOD;
    int where = MOD - 2, sol = 1;

    while(where){
        int lg2 = int(log2(where));
        where -= (1 << lg2);

        sol = (sol * pown[lg2]) % MOD;
    }

    return sol;

}