Cod sursa(job #1287789)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 7 decembrie 2014 23:50:04
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;

const int PMAX = 1e6 + 2, MOD = 9973;

vector <int> primes, de, p;
bitset <PMAX> check;

void ciur () {

    int k;
    primes.push_back (2);
    for (int i = 3; i <= PMAX; i += 2) {
        if (!check[i]) {
            primes.push_back (i);
            for (k = 3 * i; k <= PMAX; k += 2 * i)
                check[k] = 1;
        }
    }

}

long long power (long long a, int b) {

    long long c = 1;
    for (; b; b >>= 1) {
        if (b & 1)
            c *= a;
        a *= a;
    }
    return c;

}

void solve (int N) {

    vector <int> :: iterator k = primes.begin (), j;
    de.clear ();
    p.clear ();
    int s;
    for (; *k**k <= N && k != primes.end (); ++k) {
        if (N % *k == 0) {
            de.push_back (*k);
            s = 0;
            while (N % *k == 0) {
                N /= *k;
                ++s;
            }
            p.push_back (s);
        }
    }
    if (N != 1) {
        de.push_back (N);
        p.push_back (1);
    }
    long long modul = 1, suma = 1;
    for (k = p.begin (); k != p.end (); ++k)
        modul *= 1LL * (*k + 1);
    for (k = de.begin (), j = p.begin (); k != de.end (); ++k, ++j) {
        suma = suma * ((power (*k, *j + 1) - 1) / (*k - 1)) % MOD;
    }
    printf ("%lld %lld\n", modul, suma);

}

int main () {

    freopen ("ssnd.in", "r", stdin);
    freopen ("ssnd.out", "w", stdout);
    int t, n;
    ciur ();
    scanf ("%d", &t);
    while (t--) {
        scanf ("%d", &n);
        solve (n);
    }

}