Cod sursa(job #1956722)

Utilizator razvandRazvan Dumitru razvand Data 6 aprilie 2017 23:28:28
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

ifstream in("ssnd.in");
ofstream out("ssnd.out");

const int MOD = 9973;

inline long long lgput(long long a, int p) {

    if(p == 0)
        return 1;
    if(p == 1)
        return a%MOD;

    if(p%2 == 0) {
        long long t = lgput(a, p/2);
        return (t*t)%MOD;
    } else {
        return (lgput(a, p-1)*(a%MOD))%MOD;
    }

}

void solve(long long n) {

    int todo = sqrt(n);
    int am = 0;
    long long sum = 1;
    long long prod = 1;

    for(int i = 2; i <= todo; i++) {

        if(n%i == 0) {

            am = 0;

            while(n%i == 0) {
                n /= i;
                am++;
            }

            sum *= (am+1);
            long long T = (lgput(i, am+1)-1+MOD)%MOD;
            long long invmod = lgput(i-1, MOD-2);
            T = (T*invmod)%MOD;
            prod = (prod*T)%MOD;

        }

    }

    if(n != 1) {

        sum *= 2;
        long long T = (lgput(n, 2)-1+MOD)%MOD;
        long long invmod = lgput(n-1, MOD-2);
        T = (T*invmod)%MOD;
        prod = (prod*T)%MOD;

    }

    out << sum << " " << prod << '\n';

}

int main() {

    int t;
    in >> t;
    long long n;

    for(int i = 1; i <= t; i++) {
        in >> n;
        solve(n);
    }

    return 0;
}