Cod sursa(job #2356751)

Utilizator BogdanRazvanBogdan Razvan BogdanRazvan Data 26 februarie 2019 21:23:11
Problema Suma si numarul divizorilor Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>
#define MOD 9973
using namespace std;
bool Prim[1000005];
int Pr[78500], k = 1;
void Ciur()
{
    Pr[k] = 2;
    for(int i = 3; i <= 1000000; i += 2) {
        if(!Prim[i]) {
            Pr[++k] = i;
            for(int j = 3; i * j <= 1000000; j += 2) Prim[i * j] = 1;
        }
    }
}
long long power(int n, int p)
{
    long long ans = 1;
    for(; p; p >>= 1) {
        if((p & 1) == 1) ans = (1LL * ans * n);
        n = (1LL * n * n);
    }
    return ans;
}
int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    Ciur();
    int t;
    scanf("%d", &t);
    while(t--) {
        long long nr;
        int ans1 = 1;
        long long ans2 = 1;
        scanf("%lld", &nr);
        for(int i = 1; Pr[i] <= nr && i <= k; i++) {
            int e = 0;
            while(nr % Pr[i] == 0) nr /= Pr[i], ++e;
            ans1 *= (e + 1);
            if(e) ans2 = (ans2 * ((power(Pr[i], e + 1)  - 1) / (Pr[i] - 1)));
        }
        if(nr > 1) ans2 = (1LL * ans2 *  ((power(nr, 2) - 1) / (nr - 1))), ans1 *= 2;
        printf("%d %lld\n", ans1, ans2 % MOD);
    }
    return 0;
}