Cod sursa(job #2479838)

Utilizator ana.pintiliciucAna Maria Pintiliciuc ana.pintiliciuc Data 24 octombrie 2019 16:47:46
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <cstdio>
#define MOD 9973
#include <algorithm>

using namespace std;

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

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

long long invmod(long long x)
{
    long long x1=euclid(x, MOD).first;
    while(x1<0)
        x1+=MOD;
    return x1;
}

long long ridicare(long long n, long long p)
{
    long long rez=1;
    while(p>0)
    {
        if(p%2==1)
        {
            p--;
            rez=(rez*n)%MOD;
        }
        p/=2;
        n=(n*n)%MOD;

    }
    return rez%MOD;
}

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

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

void descFactoriPrimi(long long x)
{
    long long nr=1, sus=1, jos=1, tot=1;
    int d=0;
    for(int i=1; a[i]*a[i]<=x && prim(x)==1 && i<=a[0]; i++)
    {
        d=0;
        int p=a[i];
        while(x%p==0)
        {
            x/=p;
            d++;
        }
        nr=((nr*(1+d))%MOD)%MOD;
        sus=(ridicare(p, d+1)-1)%MOD;
        jos=(p-1)%MOD;
        tot=(tot*(sus*invmod(jos))%MOD)%MOD;
    }

    if(x!=1)
    {
        nr=((nr*2)%MOD)%MOD;
        sus=(ridicare(x, 2)-1)%MOD;
        jos=(x-1)%MOD;
        tot=(tot*(sus*invmod(jos))%MOD)%MOD;
    }
    printf("%lld %lld\n", nr, tot);
}

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

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

    return 0;
}