Cod sursa(job #2187193)

Utilizator LivcristiTerebes Liviu Livcristi Data 26 martie 2018 12:05:14
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <bitset>
#define NUM 1000005
#define MOD 9973
using namespace std;
bitset <NUM> verif;
int prim[NUM];
int nrprim, t, n, sum_s, sum_j, nrdiv, cnt, pd, aux, mod, auxy;
void ciur()
{
    for(int i = 2; i < NUM; ++i)
    {
        if(verif[i] == 0)
        {
            prim[nrprim++] = i;
            for(long long d = 1LL * i * i; d < NUM; d += i)
                if(d < NUM)
                    verif[d] = 1;
        }
    }
}
void inv_mod(int &x, int &y, int a, int b)
{
    if(!b)
    {
        x = 1;
        y = 0;
    }
    else
    {
        int aux;
        inv_mod(x, y, b, a % b);
        aux = x;
        x = y;
        y = aux - (a / b) * y;
    }
}
int main()
{
    ifstream f("ssnd.in");
    ofstream g("ssnd.out");
    f >> t;
    ciur();
    for(int i = 0; i < t; ++i)
    {
        f >> n;
        sum_s = sum_j = 1;
        nrdiv = 1;
        for(int d = 0; (1LL * prim[d] * prim[d]) <= n && d < nrprim; ++d)
        {
            if(!(n % prim[d]))
            {
                pd = 1;
                cnt = 0;
                while(!(n % prim[d]))
                    n /= prim[d], cnt++, pd = 1LL * pd * prim[d] % MOD;
                pd *= prim[d] % MOD;
                nrdiv = 1LL * nrdiv * (cnt + 1) % MOD;
                sum_s = 1LL * sum_s * (pd - 1) % MOD;
                sum_j = 1LL * sum_j * (prim[d] - 1) % MOD;
            }
        }
        if(n > 1)
        {
            nrdiv = nrdiv * 2 % MOD;
            sum_s = 1LL * sum_s * (n % MOD * n % MOD - 1) % MOD;
            sum_j = 1LL * sum_j * (n - 1) % MOD;
        }
        g << nrdiv << " ";
        mod = MOD;
        aux = 0;
        inv_mod(aux, auxy, sum_j, mod);
        if(aux <= 0)
            aux += MOD;
        g << (1LL * sum_s * aux) % MOD << "\n";
    }
    f.close();
    g.close();
}