Cod sursa(job #2479876)

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

using namespace std;

int t;
long long a[1000005];
long long n;
bitset <1000005> ciur;

long long putere(long long n, long 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<=1000002; i++)
    {
        if(ciur[i] == 0)
        {
            for(int j=i+i; j<=1000002; j+=i)
                ciur[j]=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;
        }
    }
    //fin=(sus*invMod(jos))%MOD;
    if(x != 1)
    {
        nr=(nr*2)%MOD;
        fin=(fin*(1+x))%MOD;
    }
    printf("%lld %lld\n", nr, fin);

}

int main()
{

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

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


    return 0;
}