Cod sursa(job #863713)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 23 ianuarie 2013 23:30:45
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <bitset>
#include <fstream>

using namespace std;

#define Nmax 1000001
#define modulo 9973

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

int 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 int putere(int a, int b){

    int raspuns = 1;

    while(b){

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

        b >>= 1;
        a = (a * a) % modulo;
    }

    return raspuns;
}

void descomp(int a){

    int nr = 1, ns = 1;

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

        if(a % div[i])
            continue;

        int contor = 0;

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

        nr *= (contor + 1);

        ns = (ns * ((putere(div[i], contor + 1) - 1) % modulo) / (div[i] - 1)) % modulo;
    }

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

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

void rezolva(){

    int n, a;

    for(f >> n; n; n--){

        f >> a;

        descomp(a);
    }
}



int main(){

    gen();
    rezolva();

    return 0;
}