Cod sursa(job #1212880)

Utilizator mariusn01Marius Nicoli mariusn01 Data 26 iulie 2014 12:57:31
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <bitset>
#include <cmath>
#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;

int putere(int a, int b) {
    int r = 1;
    a%=MOD;
    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;
        int m = (int) sqrt(n);
        nd = 1; pd = 1;
        for (i=1;n!=1 && 1LL*P[i]*P[i]<=n;i++) {
            if (n%P[i] == 0) {
                D = P[i];
                E = 1;
                while (n%D == 0) {
                    E++;
                    n/=D;
                }

                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;
}