Cod sursa(job #1915177)

Utilizator zeboftwAlex Mocanu zeboftw Data 8 martie 2017 20:04:32
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

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

vector<int> prime;
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;
        }
    }

    for (int i=2; i<=limit; i++) if (!ciur[i]) prime.push_back(i);
}

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

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));
            nr = (nr * (d + 1));
        }

        for (auto it:prime) {
            if (it > aux) break;
            d = 0;
            while (x % it == 0) x/=it, d++;
            if (d!=0) {
                sum = ((sum * (lgput(it, d+1) - 1)) / (it-1));
                nr = (nr * (d + 1));
            }
        }

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

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

    return 0;
}