Cod sursa(job #2000332)

Utilizator stefan_creastaStefan Creasta stefan_creasta Data 13 iulie 2017 13:25:04
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>
using namespace std;
const int MOD = 9973;
const int NMAX = 1000000;
bool vf[NMAX + 5];
int nrp[NMAX + 5];
int k;
long long int n;
void ciur() {
    for(int i = 2; i < NMAX; ++i) {
        if(vf[i] == 0) {
            nrp[++k] = i;
            for(int j = i + i; j < NMAX; j += i) {
                vf[j] = 1;
            }
        }
    }
}
int putere(int x, int p)
{
    int sol = 1;
    x %= MOD;
    for(;p; p /= 2) {
        if(p % 2) {
            sol *= x;
            sol %= MOD;
        }
        x *= x;
        x %= MOD;
    }
    return sol;
}
void rezolvare()
{
    int sol1 = 1, sol2 = 1;
    for(int i = 1;i <= k && nrp[i] * nrp[i] <= n; ++i) {
        if(n % nrp[i] == 0) {
            int p =  0;
            while(n % nrp[i] == 0) {
                n /= nrp[i];
                ++p;
            }
            sol1 *= (p + 1);
            int p1 = (putere(nrp[i], p + 1) - 1) % MOD;
            int p2 = putere(nrp[i] -1, MOD - 2) % MOD;
            sol2 = (((sol2 * p1) % MOD) * p2) % MOD;
        }
    }
    if(n > 1) {
        sol1 *= 2;
        sol2 = (1LL * sol2 * (n + 1) % MOD);
    }
    printf("%d %d\n", sol1, sol2);
}

int main()
{
    int T;
    freopen("ssnd.in","r",stdin);
    freopen("ssnd.out","w",stdout);
    scanf("%d", &T);
    ciur();
    for(int q = 0;q < T; ++q) {
        scanf("%lld", &n);
        rezolvare();
    }
    return 0;
}