Cod sursa(job #2479811)

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

using namespace std;

int 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;
        }
    }
}

int prim(long long x)
{
    if(x > 1000000)
        return 1;
    return ciur[x];
}

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

}

int main()
{

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

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


    return 0;
}