Cod sursa(job #1212862)

Utilizator mariusn01Marius Nicoli mariusn01 Data 26 iulie 2014 12:08:57
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 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/=2;
    }
    return r;
}

int main() {
    for (i=2;i<=1000000;i++) {
        if (v[i] == 0) {
            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]<=m;i++) {
            if (n%P[i] == 0) {
                k++;
                D = P[i];
                E = 0;
                while (n!=1 && n%P[i] == 0) {
                    E++;
                    n/=P[i];
                }

                nd = nd * (1+E);
                x = putere(D, 1+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 = 1;
            nd = nd * (1+E);
            x = putere(D, 1+E);
            x--;
            if (x < 0)
                x+=MOD;
            y = putere((D+MOD-1)%MOD, MOD-2);
            x = x * y % MOD;
            pd = pd * x % MOD;



        }

        for (i=1;i<=k;i++) {
        }
        fout<<nd<<" "<<pd<<"\n";
    }

    return 0;
}