Cod sursa(job #3259521)

Utilizator vladm98Munteanu Vlad vladm98 Data 26 noiembrie 2024 18:25:12
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;

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

long long ridicare(long long a, int n) {
    long long rasp = 1;
    while(n > 0) {
        if(n % 2 == 1)
            rasp = rasp * a;
        a = a * a;
        n /= 2;
    }
    return rasp;
}

bool isPrime[1000005];
vector <int> eratosthene() {
    vector <int> primes;

    for (int i = 2; i <= 1000000; ++i) {
        isPrime[i] = 1;
    }

    for (int i = 2; i <= 1000000; ++i) {
        if (isPrime[i]) {
            primes.push_back(i);

            for (int j = 2 * i; j <= 1000000; j += i) {
                isPrime[i] = 0;
            }
        }
    }

    return primes;
}

const int MOD = 9973;

int main() {
    int t, nr_div, d, p;
    long long x, sum_div;
    vector <int> primes = eratosthene();
    int indicePrime = 0;
    f>>t;
    for(int i = 1; i<=t; i++){
        f>>x;
        nr_div = 1;
        sum_div = 1;
        indicePrime = 0;
        d = primes[indicePrime];
        while(x>1){
            if(x%d==0){
                p = 0;
                while(x%d==0){
                    p++;
                    x /= d;
                }
                nr_div *= (p+1);
                sum_div = (sum_div*(ridicare(d, p+1)-1)/(d-1));
            }
            indicePrime += 1;
            d = primes[indicePrime];
            if(x>1 && d*d>x){
                d=x;
            }
        }
        g<<nr_div % MOD <<" "<<sum_div % MOD <<"\n";
    }
    return 0;
}