Cod sursa(job #1288390)

Utilizator FlameingoAiordachioaei Marius Flameingo Data 8 decembrie 2014 19:47:14
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;

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

vector <int> primes, p;
vector <long long> de;
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;
    a %= MOD;
    for (; b; b >>= 1) {
        if (b & 1)
            c = c * a % MOD;
        a = a * a % MOD;
    }
    return c;

}

void solve (long long N) {

    vector <int> :: iterator k = primes.begin ();
    vector <long long> :: iterator j;
    de.clear ();
    p.clear ();
    int s;
    for (; 1LL**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 (j = de.begin (), k = p.begin (); j != de.end (); ++j, ++k) {
        int p1, p2;
        p1 = (power (*j, *k + 1) - 1) % MOD;
        p2 = power (*j - 1, MOD - 2) % MOD;
        //suma = ((suma * (power (*j, *k + 1) - 1) % MOD) * (power (*j - 1, MOD - 2) % MOD)) % MOD;
        suma = (suma * p1 % MOD) * p2 % MOD;
    }
    printf ("%lld %lld\n", modul, suma);

}

int main () {

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

}