Cod sursa(job #2682277)

Utilizator cristia_razvanCristia Razvan cristia_razvan Data 8 decembrie 2020 13:12:39
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>
#define Mod 9973
#define nrm 1000005
using namespace std;


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

bitset<nrm> b;
vector<long long>prime;
void ciur()
{
    prime.push_back(2);
    for (long long i = 4; i < nrm; i += 2)
        b[i] = 1;
    for (long long i = 3; i  < nrm; i += 2)
        if (b[i] == 0)
        {
            prime.push_back(i);
            for (long long j = i *i; j < nrm; j += i)
                b[j] = 1;
        }
}

unsigned long long LogP(unsigned long long a, unsigned long long n)
{
    unsigned long long p;
    for (p = 1; n > 0; n /= 2)
    {
        if (n % 2 == 1)
            p = 1LL * p * a % Mod;
        a = a * a % Mod;
    }
    return p;
}
void Descompunere(long long n)
{
    long long p, e, nrDiv = 1, sumaDiv = 1;
    for (long long i = 0; i < prime.size() && 1ll*prime[i] * prime[i] <= n; i++) {
        p = prime[i];
        if (n % p == 0)
        {
            e = 0;
            while (n % p == 0)
            {
                e++;
                n /= p;
            }
            nrDiv *= (e + 1);
            sumaDiv = 1LL * sumaDiv * ((LogP(p, e + 1) - 1) % Mod) * LogP(p - 1, 9971) % Mod;
        }
        
    }
    if (n > 1)
    {
        nrDiv *= 2;
        sumaDiv = 1LL * sumaDiv * ((n * n - 1) % Mod) * 1LL * LogP(n - 1, 9971) % Mod;
    }
    fout << nrDiv << " " << sumaDiv << "\n";
}

int main()
{
    long long n;
    int T;
    ciur();
    fin >> T;
    while (T--)
    {
        fin >> n;
        Descompunere(n);
    }
    fin.close();
    fout.close();
    return 0;
}