Cod sursa(job #2479845)

Utilizator cristina-criCristina cristina-cri Data 24 octombrie 2019 16:52:07
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cstdio>
#include <algorithm>
#define MOD 9973

using namespace std;

long long t, a[1000005];
long long n;
bool ciur[1000005];

long long putere(long long n, long p)
{
    long long rez=1;
    while(p)
    {
        if(p&1)
        {
            p--;
            rez=(n*rez)%MOD;
        }
        n=(n*n)%MOD;
        p>>=1;
    }
    return rez;
}

pair <long long, long long> eExt(long long x, long long y)
{
    if(y == 0)
        return {1, 0};
    auto p=eExt(y, x%y);
    return {p.second, p.first-(x/y)*p.second};
}

long long invMod(long long x)
{
    long long k=eExt(x, MOD).first;
    while(k<0)
        k+=MOD;
    return k;
}

void ciurul()
{
    for(int i=2; i<=1000005; i++)
    {
        if(ciur[i] == 0)
        {
            for(int j=i+i; j<=1000005; j+=i)
                ciur[i]=1;
            a[++a[0]]=i;
        }
    }
}

void descFactPrimi(long long x)
{
    long long nr=1, fin=1, sus=1, jos=1, d=0;
    for(int i=1; i <= a[0] && a[i]*a[i] <= x; i++)
    {
        d=0;
        long long p=a[i];
        while(x%p == 0)
        {
            x/=p;
            d++;
        }
        if(d != 0)
        {
            nr=(nr*(1+d))%MOD;
            sus=(putere(p, d+1)-1)%MOD;
            jos=(p-1)%MOD;
            fin=(fin*(sus*invMod(jos))%MOD)%MOD;
        }
    }
    if(x != 1)
    {
        nr=(nr*2)%MOD;
        sus=(putere(x, 2)-1)%MOD;
        jos=(x-1)%MOD;
        fin=(fin*(sus*invMod(jos))%MOD)%MOD;
    }
    printf("%lld %lld\n", nr, fin);

}

int main()
{

    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);

    scanf("%lld", &t);
    ciurul();
    for(int i=1; i<=t; i++)
    {
        scanf("%lld", &n);
        descFactPrimi(n);
    }


    return 0;
}