Cod sursa(job #1927946)

Utilizator bt.panteaPantea Beniamin bt.pantea Data 15 martie 2017 19:00:02
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <bitset>
#include <vector>
#define NMAX 1000005
#define MOD 9973
using namespace std;
ifstream f ("ssnd.in");
ofstream g ("ssnd.out");
bitset < NMAX > b;
vector < int > P;
void ciur()
{
    P.push_back(2);
    for (int i = 3; i < NMAX; i+=2)
        if (!b[i]) {
            P.push_back(i);
            for (int j = i + i; j < NMAX; j += i)
                b[j] = 1;
        }
}
int pow(int a, int p) {
    int sol = 1;
    a %= MOD;
    while (p) {
        if (p % 2) {
            sol *= a;
            sol %= MOD;
        }
        a *= a;
        a %= MOD;
        p /= 2;
    }
    return sol;
}

void solve()
{
    long long n;
    f>>n;
    int nd = 1, sd = 1;
    for (int i = 0; i < P.size() && 1LL * P[i] * P[i] <= n; i++) {
        if (n % P[i]) continue;
        int p = 0;
        while (n % P[i] == 0) {
            n /= P[i];
            p++;
        }
        nd *= (p + 1);
        int p1 = (pow(P[i], p + 1) - 1) % MOD;
        int p2 = pow(P[i] - 1, MOD - 2) % MOD;
        sd = (((sd * p1) % MOD) * p2) % MOD;
    }
    if (n > 1) {
        nd *= 2;
        sd = 1LL * sd * (n + 1);
        sd %= MOD;
    }
    g<<nd<<' '<<sd<<'\n';
}

int main()
{
    ciur();
    int t;
    f>>t;
    while (t--)
        solve();
    return 0;
}