Cod sursa(job #3327623)

Utilizator sebigabiSebastian Itu sebigabi Data 4 decembrie 2025 17:08:40
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.15 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const long long VALMAX = 1e12;
const int SQRTMAX = 1e6;
const int PRIME_COUNT_MAX = 78500; //numarul de numere prime de la 1 la 1 milion
const int MOD = 9973;

bool ciur[SQRTMAX + 1];
long long primes[PRIME_COUNT_MAX];
int k=0;

void calculeaza_ciur()
{
    int i, j;

    ciur[0]=1;
    ciur[1]=1;
    for(i=4; i<=SQRTMAX; i+=2)
    {
        ciur[i]=1;
    }

    for(i=3; i*i<=SQRTMAX; i+=2)
    {
        if(ciur[i]==0)
        {
            for(j=i*i; j<=SQRTMAX; j+=2*i)
            {
                ciur[j]=1;
            }
        }
    }
}

void calculeaza_lista_prime()
{
    int i;

    k++;
    primes[1] = 2;

    for(i=3; i<=SQRTMAX; i += 2)
    {
        if(ciur[i] == 0)
        {
            k++;
            primes[k] = i;
        }
    }
}

void descompunere(long long x, int &sum_div, int &nr_div)
{
    //suma divizori: produs de (factor_i ^ (putere_i + 1) - 1) / (putere_i - 1)
    //nr divizori: produs de (putere_i + 1)

    int i, exponent=0;
    long long p=1;

    for(i=1; i<=k && x>1; i++)
    {
        if(x>1 && primes[i]*primes[i] > x)
        {
            //x ramas e prim
            //factorul este: x ^ 1

            nr_div *= 2;
            sum_div *= (x*x-1)/(x-1);
            sum_div %= MOD;

            return;
        }

        if(x % primes[i] == 0)
        {
            p=1;
            exponent = 0;
            while(x % primes[i] == 0)
            {
                x /= primes[i];
                p *= primes[i];
                exponent++;
            }

            //factorul este:   primes[i] ^ exponent

            nr_div *= (exponent + 1);
            sum_div *= (p*primes[i] - 1)/(primes[i] - 1);
            sum_div %= MOD;
        }
    }
}

int main()
{
    calculeaza_ciur();
    calculeaza_lista_prime();


    int t;
    in>>t;

    while(t--)
    {
        long long x;
        int suma=1, nr=1;

        in>>x;

        descompunere(x, suma, nr);

        out<<nr<<" "<<suma<<"\n";
    }
    return 0;
}