Cod sursa(job #2582957)

Utilizator andreisontea01Andrei Sontea andreisontea01 Data 17 martie 2020 16:02:06
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>

using namespace std;

#define MOD 9973
#define MAXN 1000000

bool ciur[MAXN + 5];
long long prime[MAXN + 5];

int len;

void init(){
    for(int i = 2; i <= MAXN; ++i){
        if(!ciur[i]){
            for(int j = i + i; j <= MAXN; j += i)
                ciur[j] = 1;
        }
    }
    prime[++len] = 2;
    for(int i = 3; i <= MAXN; i += 2){
        if(!ciur[i])
            prime[++len] = i;
    }
}

long long logpt(long long baza, long long exp){
    long long rez = 1;
    while(exp){
        if(exp % 2 == 1){
            rez *= baza;
            rez %= MOD;
        }
        baza *= baza;
        baza %= MOD;
        exp /= 2;
    }
    return rez;
}


int main()
{
    ifstream fin("ssnd.in");
    ofstream fout("ssnd.out");
    ios::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    int t;
    fin >> t;
    init();
    for(int numar = 1; numar <= t; ++numar){
        long long n;
        fin >> n;
        long long sumdiv = 1LL, nrdiv = 1, pos = 1, exp;
        while(prime[pos] * prime[pos] <= n && pos <= len){
            exp = 0;
            while(n % prime[pos] == 0){
                n /= prime[pos];
                exp++;
            }
            nrdiv *= (exp + 1);
            sumdiv *= ((logpt(prime[pos], exp + 1) - 1) / (prime[pos] - 1));
            sumdiv %= MOD;
            pos++;
        }
        if(n > 1){
            nrdiv *= 2;
            sumdiv *= (n * n - 1) / (n - 1);
            sumdiv %= MOD;
        }
        fout << nrdiv << " " << sumdiv << "\n";
    }
    return 0;
}