Cod sursa(job #3321345)

Utilizator 0021592Grecu rares 0021592 Data 9 noiembrie 2025 11:48:36
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <vector>
#define int long long
using namespace std;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
bool ciur[1000010];
int i, j, t, n, sum, number_of, numbah, how_many;
vector<int> v;
const int NR = 1000000;
const int MOD = 9973;
int fastpow(int n, int x)
{
    int p = 1;
    while(x)
    {
        if (x%2)
            p=(p*n)%MOD;
        n=(n*n)%MOD;
        x/=2;
    }
    return p;
}
int32_t main()
{
    ciur[0] = ciur[1] = 1;
    v.push_back(2);
    for (j = 2*2; j <= NR; j += 2)
        ciur[j] = 1;
    for (i = 3; i <= NR; i += 2)
    {
        if (ciur[i] == 1)
            continue;
        for (j = i*2; j <= NR; j+=i)
            ciur[j] = 1;
        v.push_back(i);
    }
    in >> t;
    while(t)
    {
        --t;
        in >> n;
        sum = 1;
        number_of = 1;
        for (auto ind : v)
        {
            if (n == 1)
                break;
            how_many = 0;
            while(n%ind == 0)
            {
                n/=ind;
                how_many++;
            }
            if (how_many == 0)
                continue;
            numbah = fastpow(ind, how_many+1);
            sum = (sum*(((numbah-1+MOD)*fastpow(ind-1, MOD-2))%MOD))%MOD;
            number_of = (number_of*(how_many+1))%MOD;
        }
        if (n != 1)
        {
            sum = (sum*((n*n-1)*fastpow(n-1, MOD-2))%MOD)%MOD;
            number_of=(number_of*2)%MOD;
        }
        out << number_of << ' ' << sum << '\n';
    }
    return 0;
}