Cod sursa(job #3254323)

Utilizator rapidu36Victor Manz rapidu36 Data 7 noiembrie 2024 10:07:06
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <bitset>
#include <vector>

using namespace std;

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

void constructie_prime(vector <int> &pr)
{
    bitset <RMAX + 1> e_prim;
    e_prim.set();
    for (int div = 2; div * div <= RMAX; div++)
    {
        if (e_prim[div])
        {
            for (int mult = div * div; mult <= RMAX; mult += div)
            {
                e_prim[mult] = 0;
            }
        }
    }
    for (int i = 2; i <= RMAX; i++)
    {
        if (e_prim[i])
        {
            pr.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 ssnd(long long n, vector <int> &pr, int &nrd, long long &sumd)
{
    nrd = sumd = 1;
    int i = 0;
    while (i < (int)pr.size() && (long long)pr[i] * pr[i] <= n)
    {
        int d = pr[i];
        if (n % d == 0)
        {
            int  p = 0;
            while (n % d == 0)
            {
                p++;
                n /= d;
            }
            nrd *= (p + 1);
            sumd *= (putere(d, p + 1) - 1) / (d - 1);
        }
        i++;
    }
    if (n != 1)
    {
        nrd *= 2;
        sumd *= (n + 1);
    }
}

int main()
{
    ifstream in("ssnd.in");
    ofstream out("ssnd.out");
    int t;
    in >> t;
    vector <int> prime;
    constructie_prime(prime);
    for (int i = 0; i < t; i++)
    {
        long long n;
        in >> n;
        int nr;
        long long sum;
        ssnd(n, prime, nr, sum);
        out << nr << " " << sum % MOD << "\n";
    }
    in.close();
    out.close();
    return 0;
}