Cod sursa(job #1014280)

Utilizator PsychoAlexAlexandru Buicescu PsychoAlex Data 22 octombrie 2013 13:32:41
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <math.h>

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

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)
        {
            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++)
    {
        int val = nr[i];
//        std::cout<<val<<'\n';
        int suma = 1;
        int numerele[nr[i] / 2], k = 2;
        for(int j = 2; j * j <= val; j++)
        {
            int appr = 0;
            while(!prims[j] && nr[i] % j == 0)
            {
                nr[i] = nr[i] / j;
                appr++;
                if(j * appr < val / 2)
                {
                    suma = suma + (j * appr);
//                    numerele[k] = j * appr;
                    k++;
                }
            }
//            std::cout<<j<<' '<<appr<<'\n';
        }
//        for(int j = 0; j < k; j++)
//        {
//            std::cout<<numerele[j]<<' ';
//        }
        if(val % 2 == 0)
        {
            k++;
//            std::cout<<val/2<<' ';
            suma = suma + (val / 2);
        }
        suma += val;
        fout<<k<<' '<<suma<<'\n';
//        std::cout<<val<<'\n';
//        std::cout<<'\n';
    }
}

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

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