Cod sursa(job #1335031)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 4 februarie 2015 21:17:41
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <vector>

#define Nmax 1000100
#define mod 9973

using namespace std;

vector <int> Prime;
bool seen[Nmax];

int Exp(int base, int power) {

    int result = 1;

    for(; power > 0; power >>= 1) {
        if(power & 1)
            result = (result * base) % mod;
        base = (base * base) % mod;
    }

    return result;
}
void Solve(int X, int & Sum, int & Div) {

    int i, power;

    Sum = 1;
    Div = 1;

    for(i = 0; i < Prime.size() && X > 1; i++)
        if(X % Prime[i] == 0) {

            for(power = 0; X % Prime[i] == 0; power++, X /= Prime[i]);

            Div = (Div * (power + 1)) % mod;
            Sum = (Sum * (Exp(Prime[i], power + 1) - 1)) % mod;
            Sum = (Sum * Exp(Prime[i] - 1, mod - 2)) % mod;
        }

    if(X > 1) {
        Div = (Div << 1) % mod;
        Sum = (Sum * (X + 1)) % mod;
    }

}
void Sieve() {

    int i, j;

    Prime.push_back(2);

    for(i = 3; i < Nmax; i += 2)
        if(!seen[i]) {

            Prime.push_back(i);

            if(j < 2000)
                for(j = i * i; j < Nmax; j += (i << 1))
                    seen[j] = true;
        }

}
int main() {

    int x, sum, div, queries;
    ifstream in("ssnd.in");
    ofstream out("ssnd.out");

    Sieve();
    in >> queries;

    while(queries--) {
        in >> x;
        Solve(x, sum, div);
        out << div << ' ' << sum << '\n';
    }

    in.close();
    out.close();

    return 0;
}