Cod sursa(job #3301441)

Utilizator Iustin_Mircea2010Iustin Mircea Iustin_Mircea2010 Data 26 iunie 2025 15:17:14
Problema Suma si numarul divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int mod = 9973; // o sa fac mod doar la final, din trei motive:
                      // 1: suma divizorilor NU are cum sa fie peste long long
                      // 2: constanta mai buna, fara atatea moduri
                      // 3: atunci cand impart la p - 1 cu invers modular s-ar putea sa se strice ceva, 
                         // daca exista un p = 9973 * x + 1

vector<int> primes;
bool ciur[1000005];

struct pf{
    int d, e;
};

int binexp(int b, int e){
    int ans = 1;
    while(e){
        if(e & 1){
            ans *= b;
        }
        b *= b;
        e >>= 1;
    }
    return ans;
}

signed main()
{
    ciur[0] = ciur[1] = 1;
    for(int i = 2; i <= 1e6; i++){
        if(!ciur[i]){
            primes.push_back(i);
            for(int j = i * i; j <= 1e6; j += i){
                ciur[j] = 1;
            }
        }
    }
    
    int t;
    cin >> t;
    while(t--){
        int n, nrdiv = 1;
        cin >> n;
        vector<pf> desc;
        for(auto p : primes){
            if(p * p > n) break;
            int cnt = 0;
            while(n % p == 0){
                cnt++;
                n /= p;
            }
            nrdiv *= (cnt + 1);
            if(cnt)
                desc.push_back({p, cnt});
        }
        if(n > 1){
            nrdiv *= 2;
            desc.push_back({n, 1});
        }
        int ans = 1;
        for(auto p : desc){
            ans *= (binexp(p.d, p.e + 1) - 1);
            ans /= (p.d - 1);
        }
        cout << nrdiv << " " << ans % mod << '\n';
    }
    
    return 0;
}