Cod sursa(job #2868856)

Utilizator AswVwsACamburu Luca AswVwsA Data 11 martie 2022 11:07:31
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;
const int NMAX = 100003, MOD = 9973;
bool c[NMAX];
vector <int> nrp;

void ciur()
{
    nrp.push_back(2);
    for (int i = 3; i * i <= NMAX; i += 2)
        if (!c[i])
            for (int j = i * i; j <= NMAX; j += (i << 1))
                c[j] = 1;
    for (int i = 3; i <= NMAX; i += 2)
        if (!c[i])
            nrp.push_back(i);
}
ll pwr(int a, int b)
{
    ll ans = 1;
    while (b)
    {
        if (b & 1)
            ans *= a;
        a *= a;
        b >>= 1;
    }
    return ans;
}
void desc(int n, int &nr, int &sum)
{
    nr = 1, sum = 1;
    for (int i = 0; i < nrp.size() and nrp[i] * nrp[i] <= n; i++)
        if (n % nrp[i] == 0)
        {
            int aux = 0;
            while (n % nrp[i] == 0)
            {
                n /= nrp[i];
                aux++;
            }
            nr *= aux + 1;
            sum = (sum * ((pwr(nrp[i], (aux + 1)) - 1) / (nrp[i] - 1)) % MOD) % MOD;
        }
    if (n > 1)
    {
        nr <<= 1;
        sum *= (n * n - 1) / (n - 1);
        sum %= MOD;
    }
}
int main()
{
    ifstream cin("ssnd.in");
    ofstream cout("ssnd.out");
    ciur();
    int t;
    cin >> t;
    while (t--)
    {
        int n, nr, sm;
        cin >> n;
        desc(n, nr, sm);
        cout << nr << " " << sm << "\n";
    }
}