Cod sursa(job #2197966)

Utilizator RaresLiscanLiscan Rares RaresLiscan Data 23 aprilie 2018 10:50:52
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>
#define maxim 1000000
#define mod 9973
using namespace std;
ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");
int v[1000005];
int prim (int n)
{
    for (int i = 2; i * i <= n; i++) {
        if (n%i == 0) return 0;
    }
    return 1;
}
void ciur ()
{
    int k = 0;
    for (int i = 2; i <= maxim; i++) {
        if (prim(i) == 1) k++, v[k] = i;
    }
}
int cautare (int n, int& numar_divizori)
{
    long long total = 1;
    int k = n;
    for (int i = 1; v[i] * v[i] <= k && n > 1; i++) {
        long long nr = 0;
        while (n%v[i] == 0) {
            nr++, n /= v[i], total += (nr * v[i]), total %= mod;
        }
        numar_divizori *= (nr + 1);
    }
    if (n != 1) numar_divizori *= 2, total += n;
    return total % mod;
}
int main()
{
    ciur();
    int t;
    fin >> t;
    for (int j = 1; j <= t; j++) {
        int n;
        fin >> n;
        int numar_divizori = 1;
        int total = cautare(n,numar_divizori);
        fout << numar_divizori << " " << total << "\n";
    }
    fin.close();
    fout.close();
    return 0;
}