Cod sursa(job #3213752)

Utilizator rapidu36Victor Manz rapidu36 Data 13 martie 2024 13:33:33
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
#include <bitset>
#include <vector>

using namespace std;

const int RAD = 1e6;
const int MOD = 9973;

vector <int> prime;

void ciur()
{
    bitset <RAD+1> c;
    for (int i = 2; i * i <= RAD; i++)
    {
        if (!c[i])
        {
            for (int mult = i * i; mult <= RAD; mult += i)
            {
                c[mult] = true;
            }
        }
    }
    for (int i = 2; i <= RAD; i++)
    {
        if (!c[i])
        {
            prime.push_back(i);
        }
    }
}

long long putere(long long a, int n)
{
    long long p = 1;
    while (n != 0)
    {
        if (n % 2 != 0)
        {
            p *= a;
        }
        a *= a;
        n /= 2;
    }
    return p;
}

void sum_nr_div(long long n, int &nr, int &sum)
{
    int ndp = prime.size(), i = 0;
    long long nr_l = 1;
    long long sum_l = 1;
    while (i < ndp && (long long)prime[i] * prime[i] <= n)
    {
        int d = prime[i];
        if (n % d == 0)
        {
            int p = 0;
            while (n % d == 0)
            {
                p++;
                n /= d;
            }
            nr_l *= (p + 1);
            sum_l *= ((putere(d, p + 1) - 1) / (d - 1));
        }
        i++;
    }
    if (n != 1)
    {
        nr_l *= 2;
        sum_l *= (n + 1);
    }
    nr = nr_l % MOD;
    sum = sum_l % MOD;
}

int main()
{
    ifstream in("ssnd.in");
    ofstream out("ssnd.out");
    ciur();
    int t;
    in >> t;
    for (int i = 0; i < t; i++)
    {
        long long n;
        int s, nr;
        in >> n;
        sum_nr_div(n, nr, s);
        out << nr << " " << s << "\n";
    }
    in.close();
    out.close();
    return 0;
}