Cod sursa(job #2443495)

Utilizator evelina.nitoiuNitoiu Evelina evelina.nitoiu Data 28 iulie 2019 13:22:01
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX=1000005,MOD=9973;
char ciur[NMAX];
int p[NMAX];
long long n,k;

int sieve(){
    for (int i = 4; i <= NMAX; i += 2)
        ciur[i] = 1;
    p[++k] = 2;
    for (int i = 3; i <= NMAX; i += 2) {
        if (!ciur[i]) {
            p[++k] = i;
            for (int j = i + i; j <= NMAX; j += i)
                ciur[j] = 1;
            }
        }
}
inline int log_pow(int n,int p){
    int r=1;
    n%=MOD;
    while(p){
        if(p%2==1)
            r=(1LL*r*n)%MOD;
        n=(1LL*n*n)%MOD;
        p=p/2;
    }
    return r;
}
void invers_modular(int a, int b, int &x, int &y)
{
     if (!b)
         x = 1, y = 0;
     else
     {
         invers_modular(b, a%b, x, y);
         int aux = x;
         x = y;
         y = aux - y * (a / b);
     }
}
void solve(long long number) {
    int nr_d = 1, sum_d = 1;
    for (int i = 1; i <= k && p[i] * p[i] <= number; i++) {
        if (number % p[i] == 0) {
            int pi = 0;
            while (number % p[i] == 0) {
                number /= p[i];
                pi++;
            }
                    nr_d *= (pi + 1);
                    int numarator, invers_numitor, xx;
                    numarator = (log_pow(p[i], pi + 1) - 1) % MOD;
                    invers_modular(p[i] - 1, MOD, invers_numitor, xx);
                    if (invers_numitor < 0) invers_numitor = MOD + invers_numitor % MOD;
                    sum_d = (((sum_d * numarator) % MOD) * invers_numitor) % MOD;
         }
    }
    if (number > 1) {
    nr_d *= 2;
    sum_d = (1ll * sum_d * (number + 1) % MOD);
  }
  out << nr_d << " " << sum_d << "\n";
}
int main()
{
    sieve();
    int t;
    in >> t;
    while (t--) {
        in >> n;
        solve(n);
    }
    return 0;
}