Cod sursa(job #3206340)

Utilizator Radu_MocanasuMocanasu Radu Radu_Mocanasu Data 22 februarie 2024 12:51:56
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.48 kb
//#pragma GCC optimize("Ofast,inline,unroll-loops")
#include <bits/stdc++.h>
#define mod 9973
using namespace std;
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
typedef long long ll;
void euclid(ll a, ll b, ll &x, ll &y){
    if(!b){
        x = 1;
        y = 0;
        return;
    }
    ll x0, y0;
    euclid(b, a % b, x0, y0);
    x = y0;
    y = x0 - (a / b) * y0;
}
ll invmod(ll n){
    ll x,y;
    euclid(n,mod,x,y);
    return (x % mod + mod) % mod;
}
bitset <1000005> c;
vector <int> prime;
void ciur(int n){
    int i,j;
    c[0] = c[1] = 1;
    for(i = 4; i <= n; i += 2) c[i] = 1;
    for(i = 3; i * i <= n; i += 2){
        if(!c[i]){
            for(j = i * i; j <= n; j += 2 * i) c[j] = 1;
        }
    }
    for(i = 1; i <= n; i++){
        if(!c[i]) prime.push_back(i);
    }
}
int main()
{
    int t,k;
    long long n,d,s,nr;
    fin >> t;
    ciur(1e6);
    while(t--){
        k = 0;
        nr = s = 1LL;
        fin >> n;
        d = 2;
        while(n > 1){
            int p = 0;
            long long e = d;
            while(n % d == 0){
                p++;
                n /= d;
                e = (e * d) % mod;
            }
            if(p){
                nr = (nr * (p + 1)) % mod;
                s = (s * (e + mod - 1) * invmod(d - 1)) % mod;
            }
            if(d * d >= n) d = n;
            else d = prime[++k];
        }
        fout << nr << " " << s << "\n";
    }
    return 0;
}