Cod sursa(job #1745159)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 21 august 2016 13:32:02
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

bool b[1000006];
vector<int> v, pr, f;
vector< pair<int, int> > dv;

void read();
void sieve();
void solve();

int main(){
    read();
    sieve();
    solve();
    return 0;
}

void read(){
    ifstream fin ("ssnd.in");
    int test, x;
    fin >> test;
    while (test--)
        fin >> x,
        v.push_back(x);
    fin.close();
}

void sieve(){
    for (int d = 2; d * d <= 1000001; ++d)
        if (!b[d])
            for (int i = d * d; i <= 1000001; i += d)
                b[i] = 1;
    for (int i = 2; i <= 1000001; ++i)
        if (!b[i])
            pr.push_back(i);
}

void solve(){
    ofstream fout ("ssnd.out");
    int nr, sm;
    for (unsigned int i = 0; i < v.size(); ++i){
        int n = v[i];
        if (!b[n]){
            fout << "2 " << n+1 << "\n";
            continue;
        }
        dv.clear();
        f.clear();
        for (int j = 0; pr[j] * pr[j] <= v[i]; ++j)
            if (!(n%pr[j])){
                int r(0);
                f.push_back(1);
                while (!(n % pr[j]))
                    ++r,
                    f[f.size()-1] *= pr[j],
                    n /= pr[j];
                f[f.size()-1] *= pr[j];
                dv.push_back(make_pair(pr[j], r));
            }
        nr = 1, sm = 1;
        for (unsigned int i = 0; i < dv.size(); ++i)
            nr *= dv[i].second+1,
            sm *= (f[i]-1)/(dv[i].first-1);
        fout << nr << " " << sm << "\n";
    }
    fout.close();
}