Cod sursa(job #3151847)

Utilizator alexvali23alexandru alexvali23 Data 23 septembrie 2023 00:20:55
Problema Suma si numarul divizorilor Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>

using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
int t, nDiv, sumDiv;
long long n;
const int MOD = 9973;
int powlg(int n, int p)
{
    int val = 1, x = n % MOD;
    while(p)
    {
        if(p & 1)
            val = val * x % MOD;
        x = x * x % MOD;
        p >>= 1;
    }
    return val;
}

void sdiv()
{
    sumDiv = 1;
    nDiv = 1;
    if(n % 2 == 0)
    {
        int p = 0;
        while(n % 2 == 0)
        {
            p++;
            n /= 2;
        }
        nDiv *= (p + 1);
        sumDiv = powlg(2, p + 1) - 1;
    }
    for(int d = 3; 1LL * d * d <= n; d += 2)
    {
        if(n % d == 0)
        {
            int p = 0;
            while(n % d == 0)
            {
                p++;
                n /= d;
            }
            nDiv *= (p + 1) % MOD;
            sumDiv *= 1LL * (powlg(d, p + 1) - 1) % MOD * powlg(d - 1, MOD - 2) % MOD;
        }
    }
    if(n > 1)
    {
        nDiv = nDiv * 2 % MOD;
        sumDiv = 1LL * sumDiv * (n + 1) % MOD;
    }
}

int main()
{
    f >> t;
    for(int i = 1; i <= t; i++)
    {
        f >> n;
        sdiv();
        g << nDiv << ' ' << sumDiv << '\n';
    }
    f.close();
    g.close();
    return 0;
}