Cod sursa(job #1822183)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 4 decembrie 2016 14:03:55
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>

using namespace std;

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

const int N = 1000010, mod = 9973;

long long x;
int t, i, k, nr, aux, nrd, sd, v[N], p1, p2;
bool viz[N];

int putere(int x, int y) {
    int aux = 1;
    x %= mod;
    for(; y; y >>= 1) {
        if (y & 1) {
            aux = (aux * x) % mod;
        }
        x *= x;
        x %= mod;
    }
    return aux;
}

void ciur(){
    long long i, j;
    viz[0] = 1;
    viz[1] = 1;
    v[1] = 2;
    k = 1;
    for (i = 3; i < N; i += 2) {
        if (viz[i] == 0) {
            v[++k] = i;
            for (j = i + i; j < N; j += i) {
                viz[j] = 1;
            }
        }
    }
}

int main(){
    ciur();
    fin >> t;
    for(; t; --t) {
        fin >> x;
        i = 1;
        nrd = 1;
        sd = 1;
        while (x > 1 && 1LL * v[i] * v[i] <= x){
            if (x % v[i] == 0) {
                aux = 1;
                nr = 0;
                while (x % v[i] == 0)
                    x /= v[i], nr++;
                aux = aux * v[i];
                nrd = nrd * (nr + 1);
                sd = ( sd*(aux - 1) / (v[i] - 1) ) % mod;
                p1 = ( putere(v[i], nr + 1) - 1) % mod;
                p2 = putere(v[i] - 1, mod - 2) % mod;
                sd = ( ( (sd * p1) % mod ) * p2 ) % mod;
                if (sd == 0) {
                    sd = mod;
                }
            }
            i++;
        }
        if (x > 1) {
            nrd *= 2;
            sd = ( 1LL * sd * (x + 1) % mod );
        }
        fout << nrd << ' ' << sd << "\n";
    }
    return 0;
}