Cod sursa(job #1018412)

Utilizator PsychoAlexAlexandru Buicescu PsychoAlex Data 29 octombrie 2013 15:49:20
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
#include <iostream>
#include <fstream>
#include <math.h>
#include <vector>
#include <stdlib.h>

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

struct myVal
{
    int aparitii, val;
};

std::vector<int> nrPrime;

void setPrime(bool prims[])
{
    int n = 1000001;
    prims[0] = true;
    prims[1] = false;
    for(int i = 2; i * i < n; i++)
    {
        if(prims[i] != true)
        {
            nrPrime.push_back(i);
            prims[i] = false;
            int j = i + i;
            while(j * j < n)
            {
                prims[j] = true;
                j += i;
            }
        }
    }
}

void citire(int &n, int nr[])
{
    fin>>n;
    for(int i = 0; i < n; i++)
    {
        fin>>nr[i];
    }
}

void rezolvare(int n, int nr[], bool prims[])
{
    for(int i = 0; i < n; i++)
    {
        std::vector<myVal> divizorii;
        int val = nr[i];
        for(int j = 0; j * j <= val ; j++)
        {
            if(nr[i] % nrPrime[j] == 0)
            {
                myVal vs;
                vs.val = nrPrime[j];
                vs.aparitii = 0;

                while(!(nr[i] % nrPrime[j]))
                {
                    vs.aparitii++;
                    nr[i] = nr[i] / nrPrime[j];
                }
                divizorii.push_back(vs);

            }
        }
        if(divizorii.empty())
        {
            myVal vs;
            vs.aparitii = 1;
            vs.val = val;
            divizorii.push_back(vs);
        }

        int nrDiv = 1;
        for(int i = 0; i < divizorii.size(); i++)
        {
            nrDiv = nrDiv * (divizorii[i].aparitii + 1);
        }
        fout<<nrDiv<<' ';

        int sumaDiv = 1;
        for(int i = 0; i < divizorii.size(); i++)
        {
            sumaDiv = sumaDiv * ((pow(divizorii[i].val, divizorii[i].aparitii + 1) - 1) / (divizorii[i].val - 1));
        }
        fout<<sumaDiv<<'\n';
    }
}

int main()
{
    int n;
    bool prims[1000001];
    int nr[1001];
    setPrime(prims);

    citire(n, nr);
    rezolvare(n, nr, prims);
    return 0;
}