Cod sursa(job #1018438)

Utilizator PsychoAlexAlexandru Buicescu PsychoAlex Data 29 octombrie 2013 16:53:34
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.52 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
{
    long long aparitii, val;
};

std::vector<long long> nrPrime;

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

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

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

                while(nr[i] % nrPrime[j] == 0)
                {
                    vs->aparitii++;
                    nr[i] = nr[i] / nrPrime[j];
                }
                divizorii.push_back(vs);
            }
            if(nr[i] == 1)
            {
                break;
            }
        }
        if(divizorii.empty())
        {
            myVal *vs = new myVal;
            vs->aparitii = 1;
            vs->val = val;
            divizorii.push_back(vs);
        }

        int nrDiv = 1;
        for(int j = 0; j < divizorii.size(); j++)
        {
//            std::cout<<divizorii[j]->val<<' '<<divizorii[j]->aparitii<<"; ";
            nrDiv = nrDiv * (divizorii[j]->aparitii + 1);
        }
        fout<<nrDiv<<' ';
//        std::cout<<'\n';

        int sumaDiv = 1;
        for(int j = 0; j < divizorii.size(); j++)
        {
            sumaDiv = sumaDiv * (long long)((pow(divizorii[j]->val, divizorii[j]->aparitii + 1) - 1) / (divizorii[j]->val - 1)) % 9973;
        }
        fout<<sumaDiv<<'\n';
        while(!divizorii.empty())
        {
            delete divizorii.back();
            divizorii.pop_back();
        }
    }
}

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

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