Cod sursa(job #2601248)

Utilizator Galatanu_BogdanGalatanu Bogdan Ioan Galatanu_Bogdan Data 14 aprilie 2020 10:45:53
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
//#include <iostream>
#include <fstream>
#include <vector>
#define limit 1000000
using namespace std;

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

int ciur[1000001];
vector<int>primNumbers;
void eratosthenes()
{
    primNumbers.push_back(2);
    for(int i=3;i<=limit;i+=2)
        if(!ciur[i])
        {
            primNumbers.push_back(i);
            for(int j = 2 * i;j<=limit;j+=i)
                ciur[j] = 1;
        }
}


long long pow(long long x,long long p)
{
    if(p == 0)
        return 1;
    if(p == 1)
        return x;
    
    long long rez = pow(x, p/2);
    
    if(p % 2 == 0)
        return (rez * rez);
    
    return (rez * rez * x);
}

void descompunere(long long x,long long &card, long long &sum)
{
    int i = 0,exp;
    
    card = 1;
    sum = 1;
    
    while(x != 1)
    {
        exp = 0;
        
        while(x % primNumbers[i] == 0)
        {
            exp++;
            x/=primNumbers[i];
        }
        
        if(exp > 0){
            card *= (exp + 1);
            sum*=(pow(primNumbers[i],exp + 1) - 1)/(primNumbers[i] - 1);
        }
        i++;
    }
}

int main()
{
    long long card,sum,t,n;
    
    cin>>t;
    
    eratosthenes();
    
    
    for(long long i=1;i<=t;i++)
    {
        cin>>n;
        descompunere(n, card, sum);
        cout<<card<<" "<<sum<<'\n';
    }
    
}