Cod sursa(job #1759074)

Utilizator Burbon13Burbon13 Burbon13 Data 18 septembrie 2016 14:46:07
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>

using namespace std;

const int nmx = 1000002;
const int mod = 9973;

bool viz[nmx];
int fct[80000];

void ciur()
{
    fct[0] = 1;
    fct[1] = 2;

    for(int i = 3; i < nmx; i += 2)
        if(not viz[i])
        {
            fct[++fct[0]] = i;
            for(int j = 3 * i; j < nmx; j += 2 * i)
                viz[j] = true;
        }
}

void rezolvare(int val)
{
    int cardinal = 1, suma = 1;

    for(int i = 1; i <= fct[0] && fct[i] <= val; ++i)
        if(val % fct[i] == 0)
        {
            int pt = 0;

            while(val % fct[i] == 0)
            {
                ++ pt;
                val /= fct[i];
            }

            cardinal = (cardinal * (pt + 1)) % mod;

            int inm = 1, sum_p = 0;

            for(int j = 0; j <= pt; ++j)
            {
                sum_p = (sum_p + inm) % mod;
                inm = (inm * fct[i]) % mod;
            }

            suma = (suma * sum_p) % mod;
        }

    if(val > 1)
    {
        cardinal *= 2;
        suma *= (1LL * val * val - 1) % mod;
    }

    printf("%d %d\n", cardinal, suma);
}

void iterare_prin_teste()
{
    int teste, val;
    scanf("%d", &teste);

    for(int i = 1; i <= teste; ++i)
    {
        scanf("%d", &val);
        rezolvare(val);
    }
}

int main()
{
    freopen("ssnd.in", "r", stdin);
    freopen("ssnd.out", "w", stdout);
    ciur();
    iterare_prin_teste();
    return 0;
}