Cod sursa(job #2199344)

Utilizator laraamy16Cioc Amelia laraamy16 Data 27 aprilie 2018 12:11:28
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
const int MOD = 9973;
bool v[1000001];
int p[78500], nrp, t;
int nrdiv, sumdiv;
long long n;
void ciur(int n)
{
    v[0] = v[1] = 1;
    for(int i = 4; i <= n; i += 2)
        v[i] = 1;
    for(int i = 3; i * i <= n; i += 2)
        if(v[i] == 0)
            for(int j = i * i; j <= n; j += i)
                v[j] = 1;
}
int putere(int x, int ex)
{
    int q = 1;
    while(ex > 0)
        if(ex % 2 == 0)
        {
            x = 1LL * x * x % MOD;
            ex /= 2;
        }
        else
        {
            q = 1LL * q * x % MOD;
            ex--;
        }
    return q;
}
void descf(long long n)
{
    nrdiv = 1, sumdiv = 1;
    for(int i = 1; i <= nrp && 1LL * p[i]*p[i] <= n; i++)
        if(n % p[i] == 0)
        {
            int ex = 0;
            do
            {
                ex++;
                n /= p[i];
            }
            while(n % p[i] == 0);
            nrdiv = 1LL * nrdiv * (ex + 1) % MOD;
            sumdiv = 1LL * sumdiv * (putere(p[i], ex + 1) - 1 + MOD) % MOD * putere(p[i] - 1, MOD - 2) % MOD;
        }
    if(n > 1)
    {
        nrdiv = nrdiv * 2LL % MOD;
        sumdiv = sumdiv * (n + 1) % MOD;
    }
}
int main()
{
    ciur(1000000);
    p[++nrp] = 2;
    for(int i = 3; i <= 1000000; i += 2)
        if(v[i] == 0)
            p[++nrp] = i;

    f >> t;
    for(int i = 1;i <= t; i++)
    {
        f >> n;
        descf(n);
        g << nrdiv << ' ' << sumdiv << '\n';
    }
    return 0;
}