Cod sursa(job #2812700)

Utilizator divadddDavid Curca divaddd Data 4 decembrie 2021 22:00:43
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <iostream>
using namespace std;
int t,k;
long long n;
bool ciur[1000002];
long long prime[80000];

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

long long putere(long long a, long long b){
    long long ans = 1;
    for(int i = 1; i <= b; i++){
        ans *= a;
    }
    return ans;
}

void calcul(long long n){
    int nrdiv = 1;
    long long suma = 1;
    int i = 1;
    while(i <= k && prime[i]*prime[i] <= n){
        if(n%prime[i] != 0){ i++; continue; }
        int p = 0;
        long long d = prime[i];
        while(n%d == 0){
            n /= d;
            p++;
        }
        /// d ^ p
        nrdiv *= (p+1);
        suma *= (putere(d, p+1)-1)/(d-1);
        suma %= 9973;
        i++;
    }
    if(n != 1){
        /// n ^ 1
        nrdiv *= 2;
        suma *= (putere(n, 2)-1)/(n-1);
        suma %= 9973;
    }
    fout << nrdiv << " " << suma << "\n";
}

int main()
{
    for(int i = 3; i <= 1000; i += 2){
        if(ciur[i] == 0){
            ciur[i] = 1;
            for(int j = i*2; j < 1000000; j++){
                ciur[j] = 1;
            }
        }
    }
    k = 1;
    prime[1] = 2;
    for(int i = 3; i <= 1000000; i += 2){
        if(ciur[i] == 0){
            prime[++k] = i;
        }
    }

    fin >> t;
    for(int i = 1; i <= t; i++){
        fin >> n;
        calcul(n);
    }
    return 0;
}