Cod sursa(job #3214195)

Utilizator Cristian_NegoitaCristian Negoita Cristian_Negoita Data 13 martie 2024 21:14:22
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

const int RAD = 1e6;
const int MOD = 9973;

vector <int> prime;
bool c[RAD + 1] = {0};

void ciur()
{
    for(int i = 2; i * i <= RAD; i++)
    {
        if(c[i] == 0)
        {
            for(int d = i * i; d <= RAD; d += i) c[d] = 1;
        }
    }

    for(int i = 2; i <= RAD; i++)
    {
        if(c[i] == 0) prime.push_back(i);
    }
}

long long putere(long long b, long long e)
{
    long long rez = 1;
    while(e != 0)
    {
        if(e % 2 == 1)
        {
            rez *= b;
        }
        b *= b;
        e /= 2;
    }
    return rez;
}

void sum_nr_div(long long n, int &nrdiv, int &sumdiv)
{
    int nr_prime = prime.size();
    int i = 0;
    long long nr = 1;
    long long sum = 1;

    while(i < nr_prime && (long long)prime[i] * prime[i] <= n)
    {
        if(n % prime[i] == 0)
        {
            int put = 0;
            while(n % prime[i] == 0)
            {
                put++;
                n /= prime[i];
            }

            nr *= (put + 1);
            sum *= ((putere(prime[i], put + 1) - 1) / (prime[i] - 1));
        }
        i++;
    }

    if(n != 1)
    {
        nr *= 2;
        sum *= (n + 1);
    }

    nrdiv = nr % MOD;
    sumdiv = sum % MOD;
}

int main()
{
    ciur();

    int t;
    fin >> t;
    for(int i = 0; i < t; i++)
    {
        long long n;
        fin >> n;

        int nr_div;
        int sumdiv;
        sum_nr_div(n, nr_div, sumdiv);

        fout << nr_div << " " << sumdiv << "\n";
    }

    fin.close();
    fout.close();

    return 0;
}