Cod sursa(job #2790057)

Utilizator qubitrubbitQubit Rubbit qubitrubbit Data 28 octombrie 2021 13:23:56
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb

#include <fstream>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
#define MAX 1000001
#define PRIME 9973

int countDivisors(vector<pair<long long, int>> decomp)
{
    int cnt = 1;
    for (pair<long long, int> p : decomp)
    {
        cnt *= (p.second + 1);
    }
    return cnt;
}

long long divisorsSum(vector<pair<long long, int>> decomp)
{
    long long prod = 1;
    for (pair<long long, int> p : decomp)
    {
        prod *= ((pow(p.first, p.second + 1) - 1) / (p.first - 1));
        prod %= PRIME;
    }
    return prod;
}

int main()
{
    long long t, n;
    fin >> t;
    bool isPrime[MAX];
    fill(isPrime, isPrime + MAX, true);
    for (int i = 2; i < MAX; ++i)
    {
        if (isPrime[i])
        {
            for (int j = 2; j * i <= MAX; ++j)
            {
                isPrime[j * i] = false;
            }
        }
    }
    while (t-- > 0)
    {
        fin >> n;
        vector<pair<long long, int>> decomp;
        long long init = n;
        long long lim = sqrt(n);
        for (int i = 2; i <= lim && n > 1; ++i)
        {
            if (init % i == 0)
            {
                if (isPrime[i])
                {
                    long long k = i;
                    int exp = 0;
                    while (n % k == 0)
                    {
                        n /= k;
                        ++exp;
                    }
                    decomp.push_back({k, exp});
                }
                if (init / i <= MAX && isPrime[init / i])
                {
                    long long k = init / i;
                    int exp = 0;
                    while (n % k == 0)
                    {
                        n /= k;
                        ++exp;
                    }
                    decomp.push_back({k, exp});
                }
            }
        }
        if (decomp.empty())
        {
            decomp.push_back({init, 1});
        }
        fout << countDivisors(decomp) << " " << divisorsSum(decomp) << "\n";
    }
    return 0;
}