Cod sursa(job #2263687)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 19 octombrie 2018 00:56:00
Problema Suma si numarul divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

#define MaxN 1000005
#define MOD  9973
#define ll   long long

std::ifstream InFile("ssnd.in");
std::ofstream OutFile("ssnd.out");

int N, Q, K, NDiv, SDiv;
std::vector <int> Primes;
std::bitset <MaxN> Sieve;

void ComputeSieve() {
    for (int i=2, j; i<MaxN; ++i)
        if (Sieve[i] == 0) {
            Primes.push_back(i);

            for (j=2*i; j<MaxN; j+=i)
                Sieve[j] = 1;
        }
}

inline int Pow(int Baza, int Exp) {
	int Rez = 1;
	Baza %= MOD;

    while(Exp) {
        if (Exp&1)
            Rez *= Baza,
            Rez %= MOD;
        Baza *= Baza;
        Baza %= MOD;

        Exp >>= 1;
    }   return Rez;
}

void Rezolvare() {
    ComputeSieve();
    int p, P1, P2;

    while(Q--) {
        NDiv = SDiv = 1;
        InFile >> N;

        for (int i=0; i<Primes.size() && 1LL * Primes[i] * Primes[i] <= N; ++i) {
            if(N % Primes[i]) continue;

            p = 0;
            while(N % Primes[i] == 0) {
                N /= Primes[i];
                ++p;
            }   NDiv *= (p+1);

            P1 = (Pow(Primes[i], p+1) - 1)%MOD;
            P2 = (Pow(Primes[i]-1, MOD-2))%MOD;
            SDiv = (SDiv*P1) % MOD * P2 % MOD;
        }


        if(N > 1)
            NDiv *= 2,
            SDiv = (1LL*SDiv*(N+1)%MOD);

        OutFile << NDiv << " " << SDiv << "\n";
    }
}

void Citire() {
    InFile >> Q;
}

int main() {
    Citire();
    Rezolvare();

    return 0;
}