Cod sursa(job #3139188)

Utilizator SSKMFSS KMF SSKMF Data 26 iunie 2023 09:48:56
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <fstream>
#include <bitset>
using namespace std;

ifstream cin ("ssnd.in");
ofstream cout ("ssnd.out");

int prime[80001];
bitset <500000> compus;

int NumarDivizori (long long numar)
{
    int divizori = 1;
    for (int indice = 1 ; indice <= prime[0] && 1LL * prime[indice] * prime[indice] <= numar ; indice++)
    {
        int exponent = 0;
        while (numar % prime[indice] == 0) {
            numar /= prime[indice];
            exponent++;
        }

        divizori *= exponent + 1;
    }

    if (numar > 1)
        divizori <<= 1;

    return divizori;
}

int SumaDivizori (long long numar)
{
    int suma = 1;
    const int mod = 9973;
    for (int indice = 1 ; indice <= prime[0] && 1LL * prime[indice] * prime[indice] <= numar ; indice++)
    {
        long long termen = prime[indice];
        while (numar % prime[indice] == 0) {
            numar /= prime[indice];
            termen *= prime[indice];
        }

        (suma *= (termen - 1) / (prime[indice] - 1) % mod) %= mod;
    }

    if (numar > 1) 
        (suma *= (numar * numar - 1) / (numar - 1) % mod) %= mod;

    return suma;
}

int main ()
{
    prime[++prime[0]] = 2;
    for (int valoare = 3 ; valoare < 1e6 ; valoare += 2)
        if (!compus[(valoare - 1) >> 1])
        {
            prime[++prime[0]] = valoare;
            for (long long multiplu = 1LL * valoare * valoare ; multiplu < 1e6 ; multiplu += (valoare << 1))
                compus[(multiplu - 1) >> 1] = 1;
        }

    int lungime;
    cin >> lungime;

    long long numar;
    for (int indice = 1 ; indice <= lungime ; indice++)
        cin >> numar , cout << NumarDivizori(numar) << ' ' << SumaDivizori(numar) << '\n';

    cout.close(); cin.close();
    return 0;
}