Cod sursa(job #1600928)

Utilizator SavanderianAlexandru Balan Savanderian Data 15 februarie 2016 15:41:02
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int MOD = 9973;
const int MAXVAL = 1000000;

int n;

vector<int> v;
bool check[MAXVAL + 1];


void eratostene() {

    /* O(n * logn) */

    for(int i = 2; i <= MAXVAL; ++i)
        if(check[i] == 0) {

            v.push_back(i);
            for(int j = i + i; j <= MAXVAL; j += i)
                check[j] = 1;
        }
}

void find(long long x) {

    int sumdiv = 1;
    int nrdiv = 1;

    for(unsigned i = 0 ; i < v.size(); ++i) {

        int d = v[i];

        if(1ll * d * d > x) break;
        if(x % d) continue;

        int nrd = 0;
        int sirSum = 1;
        int divPow = 1;

        while(x % d == 0) {

            divPow = (1ll * divPow * d) % MOD;
            sirSum = (1ll * sirSum + divPow) % MOD;

            x /= d;
            nrd++;
        }

        nrdiv = (1ll * nrdiv * (nrd + 1)) % MOD;
        sumdiv = (1ll * sumdiv * sirSum) % MOD;
    }

    if(x > 1) {
        /*
         * poate sa ramana maxim un divizor neluat in calcul
         * si anume cel mai mare, ca un divizor sa nu fie luat in calcul trebuie ca
         * el sa fie mai mare decat produsul tutoro celoralati divizori(d^2 > x)
         * nu poate fi adevarat decat pentru cel mai mare divizor prim
         */
        nrdiv = (1ll * nrdiv * 2) % MOD;
        sumdiv = (1ll * sumdiv * (1 + x)) % MOD;
    }

    fout << nrdiv << " " << sumdiv << '\n';
}

int main() {

    fin >> n;

    eratostene();

    while(n--) {

        long long x;
        fin >> x;
        find(x);
    }

    return 0;
}