Cod sursa(job #1785460)

Utilizator elffikkVasile Ermicioi elffikk Data 21 octombrie 2016 12:51:10
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;

const int N_PRIM = 1000001;
vector <int> a;
vector<bool> prim(N_PRIM);

void ciur() {
    fill(prim.begin(), prim.end(), true);
    for (int i = 2; i*i <= N_PRIM; i++) {
        if (prim[i]) {
            for (int j = 2*i; j <= N_PRIM; j+=i ) {
                prim[j] = false;
            }
        }
    }
    for (int i = 2; i <= N_PRIM; i++) {
        if (prim[i]) {
            a.push_back(i);
        }
    }
}

bool next_subset(vector<long long> &a, vector<long long> max_a) {
    int n = a.size()-1;
    while(n>=0 && a[n]==max_a[n]) n--;
    if (n < 0) {
        return false;
    }
    a[n]++;
    fill(a.begin()+n+1, a.end(), 0);
}

long long dcount(vector<long long> a) {
    long long k = a[0]+1;
    for (int i = 1; i < a.size(); i++) {
        k*=(a[i]+1);
    }
    return k;
}

long long dsum(vector<long long> v, vector<long long> p) {
    long long s = 1;
    for (int i = 0; i < v.size(); i++) {
        if (p[i]>0) {
            s*=round(pow(v[i], p[i]));
        }
    }
    return s;
}

void solve(long long n, long long &cnt, long long &sum) {
    vector<long long> x, y, z;
    for (int i = 2; i*i <=n; i++ ) {
        int k = 0;
        while (n%i==0) {
            n/=i;
            k++;
        }
        if (k > 0) {
            x.push_back(i);
            y.push_back(k);
        }
    }
    if (n > 1) {
        x.push_back(n);
        y.push_back(1);
    }
    z.resize(x.size());
    fill(z.begin(), z.end(), 0);
    long long s = 1;
    while (next_subset(z, y)) {
        s+=dsum(x, z);
    }
    sum = s;
    cnt = dcount(y);
}

main() {
    ifstream cin("ssnd.in");
    ofstream cout("ssnd.out");
    long long n;
    cin>>n;
    ciur();
    for (int i = 0; i < n; i++) {
        long long k, nk, sk;
        cin>>k;
        solve(k, nk, sk);
        cout<<nk<<" "<<sk<<"\n";
    }

}