Cod sursa(job #3257146)

Utilizator MikeStrikeAgache Mihai MikeStrike Data 16 noiembrie 2024 19:19:59
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
using namespace std;

const int MAX_SIEVE = 1e6;  
const int MOD = 9973;       

vector<int> primes;         
vector<bool> is_prime(MAX_SIEVE + 1, true);  


void sieve() {
    is_prime[0] = is_prime[1] = false; 
    for (int i = 2; i <= MAX_SIEVE; ++i) {
        if (is_prime[i]) {
            primes.push_back(i); 
            for (long long j = 1LL * i * i; j <= MAX_SIEVE; j += i) {
                is_prime[j] = false; 
            }
        }
    }
}


pair<long long, long long> computeDivisors(long long n) {
    long long original_n = n;  
    long long count_divisors = 1;
    long long sum_divisors = 1;

    for (int p : primes) {
        if (1LL * p * p > n) break; 
        if (n % p == 0) {
            long long power = 0;
            long long current_sum = 1;
            long long current_term = 1;
            while (n % p == 0) {
                ++power;
                n /= p;
                current_term *= p;
                current_sum += current_term;
                current_sum %= MOD; 
            }
            count_divisors *= (power + 1);
            sum_divisors *= current_sum;
            sum_divisors %= MOD; 
        }
    }

    
    if (n > 1) {
        count_divisors *= 2; 
        sum_divisors *= (1 + n);
        sum_divisors %= MOD; 
    }

    return {count_divisors, sum_divisors};
}

int main() {

    sieve();

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

    int t;
    fin >> t; 
    while (t--) {
        long long n;
        fin >> n;
        pair<long long, long long> result = computeDivisors(n);
        long long count = result.first;
        long long sum = result.second;
        fout << count << " " << sum << "\n";
    }

    return 0;
}