Cod sursa(job #2646702)

Utilizator DormeoNoapte Buna Dormeo Data 1 septembrie 2020 18:24:14
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>
#define mod 9973

using namespace std;

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

const int DIM = 1000000 + 5;

vector < int > prime;

bool f[DIM];

void Ciur()
{
    for(int i = 2; i <= DIM - 5; ++i) {
        if(f[i] == false) {
            prime.push_back(i);
            for(int j = i + i; j <= DIM - 5; j += i) f[j] = true;
        }
    }
}

long long lgput(long long a, int b)
{
    long long sol = 1;
    while(b > 0) {
        if(b & 1) sol = (a * sol) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }
    return sol;
}

int main()
{
    Ciur();
    int test;

    fin >> test;
    for(; test; --test) {
        long long n, sol2 = 1;
        int sol1 = 1;
        fin >> n;
        for(int i = 0; 1LL * prime[i] * prime[i] <= n; ++i) {
            int e = 0;
            while(n % prime[i] == 0) ++e, n /= prime[i];
            sol1 *= (e + 1);
            if(e > 0) {
                ++e;
                long long raise = lgput(1LL * prime[i], e);
                sol2 = (sol2 * (raise - 1) / (prime[i] - 1)) % mod;
            }
        }
        if(n > 1) {
            sol1 *= 2;
            long long raise = lgput(n, 2);
            sol2 = (sol2 * (raise - 1) / (n - 1)) % mod;
        }
        fout << sol1 << " " << sol2 << "\n";
    }
    return 0;
}