Cod sursa(job #863725)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 23 ianuarie 2013 23:41:33
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <bitset>
#include <fstream>

using namespace std;

#define Nmax 1000001
#define modulo 9973

bitset <Nmax> ciur;
int  div[80000];

long long l = 0;

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

void gen(){

    for(int i = 2; i <= Nmax; i++)
        if(!ciur[i]){

            div[++l] = i;

            for(int j = i + i; j <= Nmax; j += i)
                ciur[j] = 1;
        }
}

inline long long putere(long long a, long long b){

    long long raspuns = 1;
    a %= modulo;

    for(b; b; b >>= 1){

        if(b & 1)
            raspuns *= a,
            raspuns %= modulo;

        a *= a;
        a %= modulo;
    }

    return raspuns;
}

void descomp(long long a){

    long long nr = 1, ns = 1;

    for(long long i = 1; i <= l && div[i] * div[i] <= a; ++i){

        if(a % div[i])
            continue;

        long long contor = 0;

        while(a % div[i] == 0)
            a /= div[i],
            contor++;

        nr *= (contor + 1);

        long long putere1 = (putere(div[i], contor + 1) - 1) % modulo;
        long long putere2 = putere(div[i] - 1, modulo - 2) % modulo;

        ns = ((( ns * putere1) % modulo ) * putere2) % modulo;
    }

    if(a > 1)
        nr *= 2,
        ns = (ns * (a + 1) % modulo);

    g << nr << " " << ns << "\n";
}

void rezolva(){

    long long n, a;

    f >> n;

    for(; n; n--){

        f >> a;

        descomp(a);
    }
}


int main(){

    gen();
    rezolva();

    return 0;
}