Cod sursa(job #2466220)

Utilizator WilIiamperWilliam Damian Balint WilIiamper Data 1 octombrie 2019 19:13:13
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <bitset>
#define inf 900000

using namespace std;

ifstream f ("ssnd.in");
ofstream g ("ssnd.out");
long long x, t, suma, nrdiv;
const int MOD = 9973;
int prim[inf];
bitset <inf> ciur;
int power(int x, int p) {
    int rez = 1;
    for (int i = 1; i <= p; i++) {
        rez *= x;
        rez %= MOD;
    }
    return rez;
}
void ssnd(long long n) {
    suma = 1;
    nrdiv = 1;
    long long i = 1;
    int putere;
    while (prim[i] * prim[i] <= x && n > 1) {
        putere = 0;
        while (n % prim[i] == 0) {
            putere++;
            n /= prim[i];
        }
        if (putere > 0) {
        nrdiv = nrdiv * (putere + 1);
        long long f1 = (power(prim[i], putere + 1) - 1) % MOD;
        long long f2 = (prim[i] - 1) % MOD;
        suma = (suma * (f1/f2)) % MOD;
        }
        i++;
    }
    if (n > 1) {
        suma = (suma * (n+1)) % MOD;
        nrdiv *= 2;
    }
}
void eratosthenes() {
    int k = 1;
    for (int i = 2; i < inf; i++)
        if (ciur[i] == 0 && i * i < inf) {
            for (int j = i + i; j < inf; j = j + i)
                ciur[j] = 1;
            prim[k++] = i;
        }
        else if (ciur[i] == 0)
        prim[k++] = i;
}
int main()
{
    f >> t;
    eratosthenes();
    for (int i = 1; i <= t; i++) {
        f >> x;
        ssnd(x);
        g << nrdiv << " " << suma<< "\n";
    }
    return 0;
}