Cod sursa(job #1915149)

Utilizator zeboftwAlex Mocanu zeboftw Data 8 martie 2017 19:55:21
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <fstream>
#include <iostream>

using namespace std;

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

bool ciur[1000005];
const int limit = 1000000;

void precalculare () {
    for (int i=4; i<=limit; i+= 2) ciur[i] = 1;

    for (int i=3; i*i<=limit; i+=2) {
        if (!ciur[i]) {
            for (int j = i*i; j<=limit; j+=i+i) ciur[j] = 1;
        }
    }
}

int long long lgput (int long long base, int exp) {
    if (exp == 1) return base % 9973;
    else {
        if (exp % 2 == 0) return lgput(base*base, exp/2) % 9973;
        else return (base * lgput (base*base, (exp-1)/2)) % 9973;
    }
}

int main()
{
    precalculare();

    int long long n, x, nr, sum, d, aux;
    fin >> n;

    for (int k=1; k<=n; k++) {
        fin >> x;

        sum = 1;
        nr = 1;
        d = 0;
        aux = x;

        while (x % 2 == 0) x/=2, d++;
        if (d!=0) {
            sum = (sum * (lgput(2, d+1) - 1)) % 9973;
            nr = (nr * (d + 1)) % 9973 ;
        }

        for (int long long i = 3; i * i <= aux; i+=2) {
            d = 0;
            if (!ciur[i]) {
                while (x % i == 0) x/=i, d++;
                if (d!=0) {
                    sum = ((sum * (lgput(i, d+1) - 1)) / (i-1)) % 9973;
                    nr = (nr * (d + 1)) % 9973 ;
                }
            }
        }

        if (x!=1) {
            sum = ((sum * (x*x-1)) / (x-1)) % 9973;
            nr = (nr * 2) % 9973 ;
        }

        fout << nr << " " << sum << '\n';
    }

    return 0;
}