Cod sursa(job #2806161)

Utilizator namesurname01Name Surname namesurname01 Data 22 noiembrie 2021 13:42:44
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.86 kb
#include <stdio.h>
#include <iostream>

using namespace std;
FILE* f, * g;

long long prime[79000], nrd = 1, sd = 0, mod = 9973, n;
bool v[1000009];

void ciur()
{
    int i, j;
    for (i = 2;i <= 1000009;++i)
    {
        if (v[i] == 0)
        {
            prime[++prime[0]] = i;
            for (j = 2 * i;j <= 1000009;j = j + i)
                v[j] = 1;
        }
    }
}

long long putere(long long  nr, long long put)
{
    long long i, prod = 1;
    for (i = 1;i <= put + 1;++i)
        prod = (prod * prime[nr] % mod) % mod;
    if (prod <= 1)
        prod = mod + prod % mod;
    --prod;

    return prod;
}

void invmod(long long a, long long b, long long& x, long long& y)
{
    long long x0, y0;
    if (!b)
        x = 1, y = 0;
    else
    {
        invmod(b, a % b, x0, y0);
        x = y0;
        y = x0 - a / b * y0;
    }
}

void divizori(long long x)
{
    long long i, p;
    long long xx, yy;
    for (i = 1;prime[i] * prime[i] <= x;++i)
    {
        p = 0;
        while (x % prime[i] == 0)
        {
            ++p;
            x /= prime[i];
        }
        if (p)
        {
            nrd *= (p + 1);
            sd = sd % mod;
            sd *= putere(i, p);
            invmod(prime[i] - 1, 9973, xx, yy);
            if (xx <= 0)
                xx = mod + xx % mod;
            sd = (sd * (xx % mod)) % mod;
        }
    }
    if (x > 1)
    {
        nrd *= 2;
        sd = (sd * (x + 1) % mod);
    }
    fprintf(g, "%lld %lld\n", nrd, sd);
}


int main()
{
    int i;
    long long x;
    f = fopen("ssnd.in", "r");
    g = fopen("ssnd.out", "w");
    ciur();

    fscanf(f, "%lld", &n);
    for (i = 1;i <= n;++i)
    {
        nrd = 1;
        sd = 1;
        fscanf(f, "%lld", &x);
        divizori(x);
    }
    fclose(f);
    fclose(g);
    return 0;
}