Cod sursa(job #1212872)

Utilizator mariusn01Marius Nicoli mariusn01 Data 26 iulie 2014 12:32:05
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#include <bitset>
#define DIM 1000010
#define MOD 9973

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

bitset<DIM> v;
int P[DIM];
int D;
int E;

long long n, m;
int t, i, j, pd, nd, x, y, p, k;

int putere(int a, int b) {
    int r = 1;
    while (b) {
        if (b&1)
            r = (r * a) % MOD;
        a = a * a % MOD;
        b>>=1;
    }
    return r;
}

int main() {
    P[p=1] = 2;
    for (i=3;i<=1000000;i+=2) {
        if (!v[i]) {
            P[++p] = i;
            for (j=i+i;j<=1000000;j+=i)
                v[j] = 1;
        }
    }

    fin>>t;
    for (;t--;) {
        fin>>n;
        k = 0;
        //long long m = n;
        nd = 1; pd = 1;
        for (i=1;1LL*P[i]*P[i]<=n && n!=1;i++) {

            k++;
            D = P[i];
            E = 1;

            while (n%D == 0) {
                E++;
                n/=P[i];
            }

            if (E == 1)
                continue;
            nd *= (E);
            x = putere(D, E);
            x--;
            if (x < 0)
                x+=MOD;
            y = putere((D+MOD-1)%MOD, MOD-2);
            x = x * y % MOD;
            pd = pd * x % MOD;


        }
        if (n!=1) {
            D = n%MOD;
            E = 2;
            nd = nd * (E);
            x = putere(D, E);
            x--;
            if (x < 0)
                x+=MOD;
            y = putere((D+MOD-1)%MOD, MOD-2);
            x = x * y % MOD;
            pd = pd * x % MOD;



        }

        fout<<nd<<" "<<pd<<"\n";
    }

    return 0;
}