Cod sursa(job #2246332)

Utilizator crion1999Anitei cristi crion1999 Data 26 septembrie 2018 22:41:37
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MOD 9973
#define MAX 1000001
using namespace std;
ifstream fi("ssnd.in");
ofstream fo("ssnd.out");
bool ciur[MAX];
long long primes[MAX];
int nrPrimes;

long long Lgput(long long a, long long n)
{
    long long sol = 1;
    while(n)
    {
        if(n & 1)
            sol *= a;
        n /= 2;
        a *= a;
    }
    return sol;
}

void MakeCiur()
{
    for(int i = 2; i*i < MAX; ++i)
    {
        if(ciur[i] == 0)
        {
            primes[++nrPrimes] = i;
            for(int j = i; j*i < MAX; ++j)
            {
                ciur[j*i] = 1;
            }
        }
    }
}

int main()
{
    MakeCiur();
    long long n,t;
    fi>>t;
    while(t--)
    {
        fi>>n;
        if(n == 1)
        {
            fo << 1 << ' ' << 1 << '\n';
            continue;
        }

        long long sum = 1, card = 1;
        long long m = n;
        for(int i = 1; i <= nrPrimes && primes[i] * primes[i] <= m; ++i)
        {
            if(n % primes[i] == 0)
            {
                int e = 0;
                while(n % primes[i] == 0)
                {
                    e++;
                    n /= primes[i];
                }
                card = card * (e+1);
                sum = (sum * ((Lgput(primes[i],e+1) - 1)/(primes[i] - 1)));
                card %= MOD;
                sum %= MOD;
            }
        }
        if(n != 1)
        {
            sum = sum * (n+1);
            card = card*2;
            card %= MOD;
            sum %= MOD;
        }

        fo<<card<<' '<<sum<<'\n';

    }


}