Cod sursa(job #2246018)

Utilizator ImbuzanRaduImbuzan Radu ImbuzanRadu Data 26 septembrie 2018 13:59:48
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>

using namespace std;

struct nrNou
{
    int n, p;
};

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

int lgPut(int a, int n)
{
    if(n == 1) return a;
    if(n % 2) return (lgPut(a, n/2) * lgPut(a, n/2) * a);
    else return lgPut(a, n/2) * lgPut(a, n/2);
}

void afisareRezultat(nrNou actual[], int actualL)
{
    int nrDiv = 1, sumDiv = 1;
    for(int i = 1; i <= actualL; i++)
    {
        nrDiv *= (actual[i].p + 1);
        sumDiv *= ((lgPut(actual[i].n, actual[i].p + 1)- 1) / (actual[i].n - 1));
    }
    g<<nrDiv<<" "<<sumDiv<<'\n';
}

void descompunere(int nr, nrNou actual[], int &actualL)
{
    int k = 2, cont = 0;
    while(nr > 1)
    {
        if(nr % k == 0)
        {
            cont++;
            nr = nr / k;
        }
        else
        {
            actualL++;
            actual[actualL].n = k;
            actual[actualL].p = cont;
            k++;
            cont = 0;
        }
    }
    actualL++;
    actual[actualL].n = k;
    actual[actualL].p = cont;

    afisareRezultat(actual, actualL);
}

int main()
{
    int n, nr[101];
    nrNou actual[101];
    int actualL = 0;
    f>>n;
    for(int i = 1; i <= n; i++)
    {
        f>>nr[i];
    }

    for(int i = 1; i <= n; i++)
    {
        descompunere(nr[i], actual, actualL);
        actualL = 0;
    }
    return 0;
}