Cod sursa(job #2244764)

Utilizator AnDrEeA1915Monea Andreea AnDrEeA1915 Data 23 septembrie 2018 17:05:31
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <bits/stdc++.h>

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

#define nr 9973

int len = 0, v[500000], a[1000000];

void ciur() {
    int i, j;
    v[len++] = 2;
    int l = 1000;
    for(i = 3; i <= l; i += 2)
        if (!a[i]) {
            v[len++] = i;
            for (j = i * i; j < 1000000; j += i)
                a[j] = 1;
        }
    for (i = l + 1; i < 1000000; i += 2)
        if (!a[i])
            v[len++] = i;
}

int putere(long long x, int n) {
    long long aux = x;
    int res = 1;
    while (n)
    {
        if (n & 1)
        {
            res *= aux;
            res %= nr;
        }
        aux *= aux;
        aux %= nr;
        n /= 2;
    }
    return res;
}

int main() {
    long long nrdiv, sdiv, p, t, i, j, put;
    long long n;
    fin >> t;

    ciur();
    for (j = 1; j <= t; ++j) {
        fin >> n;
        if (n == 1) {
            nrdiv = 1;
            sdiv = 1;
        } else {
            nrdiv = 1;
            sdiv = 1;
            for (i = 0; v[i] * v[i] <= n; ++i) {
                if (n % v[i] == 0) {
                    n /= v[i];
                    p = 1;
                    put = v[i] * v[i];
                    while (n % v[i] == 0) {
                        n /= v[i];
                        ++p;
                        put *= v[i];
                    }
                    nrdiv *= (p + 1);
                    sdiv *= (putere(v[i], p + 1) - 1);
                    sdiv %= nr;
                    sdiv *= (putere(v[i] - 1, nr - 2));
                    sdiv %= nr;
                }
            }

            if (n > 1) {
                nrdiv *= 2;
                sdiv *= ((n + 1) % nr);
            }
            sdiv %= nr;
        }
        fout << nrdiv << ' ' << sdiv << '\n';
    }

    return 0;
}