Cod sursa(job #1956740)

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

using namespace std;

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

const int MOD = 9973;
int primes[80003];
bool viz[1000003];
int MAX = 1e6+100;
int AM;

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;
    long long i = 0;

    for(int I = 1; primes[I] <= todo; I++) {

        i = primes[I];
        cout << i << '\n';

        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;

    primes[++AM] = 2;

    for(int i = 3; i <= MAX; i += 2) {

        if(!viz[i]) {

            viz[i] = 1;
            primes[++AM] = i;

            for(long long j = 1LL*i*i; j <= MAX; j += i) {
                viz[j] = 1;
            }

        }

    }

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

    return 0;
}