Cod sursa(job #3268271)

Utilizator inacioataCioata Ana Irina inacioata Data 14 ianuarie 2025 11:11:26
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
bitset<1000005> a;
int prime[500005], k;

void Ciur(int n)
{
    int i,j;
    a[1] = a[0] = 1;
    for(i = 4; i <= n; i += 2)
        a[i] = 1;
    for(i = 3; i * i <= n; i += 2)
        if(a[i] == 0)
            for(j = i * i; j <= n; j += 2 * i)
                a[j] = 1;
    prime[++k] = 2;
    for(i = 3; i <= n; i += 2)
        if(a[i] == 0) prime[++k] = i;
}

int exp(int base, int pwr)
{
    int res = 1;
    base %= 9973;
    while(pwr != 0)
    {
        if (pwr & 1) res = (res * base) % 9973;
        base = (base * base) % 9973;
        pwr >>= 1;
    }
    return res;
}

void F(long long x)
{
    int i, e, cnt = 1;
    long long s = 1;
    for(i = 1; prime[i] * prime[i] <= x; i++)
        if(x % prime[i] == 0)
    {
        e = 0;
        while(x%prime[i]==0)
        {
            x = x / prime[i];
            e++;
        }
        cnt *= (e + 1);
        s = s * (exp(prime[i], e + 1) - 1 + 9973) % 9973 * exp(prime[i] - 1, 9971) % 9973;
    }
    if(x > 1)
    {
        cnt *= 2;
        s = s * (x * x - 1) / (x - 1);
    }
    fout << cnt << " " << s << "\n";
}

int main()
{
    int t, i;
    long long x;
    Ciur(1000000);
    fin >> t;
    for(i = 1; i <= t; i++)
    {
        fin >> x;
        F(x);
    }
    return 0;
}