Cod sursa(job #1168835)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 9 aprilie 2014 18:38:55
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>
using namespace std;
const int MAXN = 1000001;
const int MOD = 9973;
int n,x,cx;
int no_d, sum_d, d, exp;
bool p[MAXN];
vector<int> primeNumbers;

int power(int base, int exp)
{
    if (exp == 1)
        return base;
    else
    {
        if (exp%2)
            return base*power(base*base, (exp-1)/2);
        else
            return power(base*base, exp/2);
    }
}

void sieve()
{
    p[0] = p[1] = true;
    unsigned int i, j;
    for (i=2; i<MAXN; ++i)
    {
        if (!p[i])
        {
            primeNumbers.push_back(i);
            for (j=i*i; j<MAXN; j+=i)
                p[j]=true;
        }
    }
}


int main()
{
    ifstream fin("ssnd.in");
    ofstream fout("ssnd.out");
    sieve();

    fin>>n;
    for (int k=1; k<=n; ++k)
    {
        fin>>x;

        cx=x;
        no_d = 1;
        sum_d = 1;
        for (vector<int>::iterator it = primeNumbers.begin(); it != primeNumbers.end(); ++it)
        {
            d = *it;
            exp = 0;
            while (cx != 1 && cx%d == 0)
            {
                cx/=d;
                ++exp;
            }

            no_d  =  (no_d * (exp+1))%MOD;
            sum_d =  (sum_d*(power(d, exp+1) -1)/(d-1))%MOD;

            if (cx == 1)
                break;
        }
        fout<<no_d<<' '<<sum_d<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}