Cod sursa(job #2981069)

Utilizator 100pCiornei Stefan 100p Data 17 februarie 2023 10:31:32
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

#define MAX 500000
#define mod 9973
#define int long long

using namespace std;

ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");

int primes[MAX + 5], q, x;
vector <bool> ciur(MAX + 5);

void compute_ciur()
{
    primes[++primes[0]] = 2;
    for(int i = 3;i <= MAX;i += 2)
    {
        if(!ciur[i >> 1])
        {
            primes[++primes[0]] = i;
            for(int j = i + i + i;j <= MAX; j += i << 1)
                ciur[j >> 1] = 1;
        }
    }
}

int expPower(int a, int b)
{
    int ans = 1;
    for(int i = 1;i <= b; ++i)
        ans *= a;
    return ans;
}

pair<int,int> solve(int & x)
{
    int nr = 1, sum = 1;
    for(int i = 1;i <= primes[0] && primes[i] * primes[i] <= x; ++i)
    {
        int cnt = 0;
        while(!(x % primes[i]))
        {
            sum %= mod;
            x /= primes[i];
            cnt++;
        }
        sum = sum * ((expPower(primes[i], cnt + 1) - 1) / (primes[i] - 1));
        sum %= mod;
        nr *= (cnt + 1);
    }

    if(x != 1)
    {
        nr *= 2;
        sum = sum * (expPower(x, 2) - 1) / (x - 1);
        sum %= mod;
    }

    return {nr, sum};
}

signed main()
{
    compute_ciur();

    fin >> q;
    while(q--)
    {
        fin >> x;
        pair <int,int> ans = solve(x);
        fout << ans.first << ' ' << ans.second % mod << '\n';
    }
}