Cod sursa(job #2579004)

Utilizator blackguy110muresan alexandru david blackguy110 Data 11 martie 2020 20:32:32
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <bitset>
#include <fstream>
#include <iostream>

using namespace std;

const int MAX = 1000005;
const int MOD = 9973;


long long n;

int t, k, p[MAX];
bitset <MAX> viz;

void ciur()
{
    for ( int i = 2; i<MAX ; ++i)
    {
        if ( viz[i]==0)
        {
            p[++k]=i;
            for(int j= i+i; j<MAX; j+=i)
                viz[j]=1;
        }
    }
}

inline int pow (int x, int p)
{
    int rez = 1; 
    x%=MOD;
    for(; p; p>>=1)
    {
        if (p&1)
        {
            rez*=x; 
            rez%=MOD;
        }
        x*=x;
        x%=MOD;
    }
    return rez;
}

void solve ()
{
    scanf("%lld", &n);
    
    int nd=1, sd=1;

    for (int i= 1; i<=k && 1LL * p[i]*p[i] <= n; ++i)
    {
        if(n%p[i]) continue;
        int P =0;
        while (n%p[i]==0)
        {
            n/=p[i];
            ++P;
        }
        nd *= (P+1);

        int P1 = (pow(p[i], P+1) - 1)%MOD;
        int P2 = pow(p[i]-1, MOD - 2)%MOD;

        sd=(((sd*P1)%MOD)*P2)%MOD;
    

    }
    if(n>1)
    {
        nd*=2;
        sd = ((1LL * sd * (n+1))%MOD);
    }
    printf ("%d, %d\n", nd, sd);
}
int main ()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    ciur();
    for (scanf("%d", &t); t; --t)
        solve();
    return 0;
}