Cod sursa(job #1791465)

Utilizator Coroian_DavidCoroian David Coroian_David Data 29 octombrie 2016 13:40:00
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.55 kb
#include <iostream>

#include <cstdio>

using namespace std;

FILE *f, *g;

bool p[1000001];

long long v[80001];

int k;

int n;

void euclid(int a, int b, int &x, int &y, int &d)
{
    if(b == 0)
    {
        x = 1;

        y = 0;

        d = a;

        return;
    }

    int xx, yy, q = a / b;

    euclid(b, a % b, xx, yy, d);

    x = yy;

    y = xx - yy * q;

}

void ciur()
{
    int n = 1000000;

    int i, j;

    p[0] = p[1] = 1;

    for(i = 4; i <= n; i += 2)
        p[i] = 1;

    for(i = 3; i * i <= n; i += 2)
        if(p[i] == 0)
            for(j = i * i; j <= n; j += i * 2)
                p[j] = 1;

    v[++ k] = 2;

    for(i = 3; i <= n; i += 2)
    {
        if(p[i] == 0)
            v[++ k] = i;
    }

    //printf("%d\n", k);
}

void poz(int &x, int n)
{
    if(x < 0)
    {
        if(-x < n)
            x += n;

        else
            if(-x >= n)
                x += (((-x) / n) + (((-x) % n) != 0)) * n;
    }
}

int power(int a, int b)
{
    int i, p = 1;

    for(i = 1; i <= b; i ++)
    {
        p *= a;
        p %= 9973;
    }

    return p;
}

void sumdiv(long long nr)
{
    long long sum, div, p, d, x, y = 1;

    sum = 1;

    div = 1;

    p = 0;

    d = 1;

    y = 1;

    while(d <= k && v[d] * v[d] * 1LL <= nr)
    {
        p = 0;

        while(nr % v[d] == 0)
        {
            nr /= v[d];

            p ++;
        }

        if(p != 0)
        {

            div *= (p + 1);

            x = (power(v[d], p + 1) - 1) ;

            y *= (v[d] - 1);

            y %= 9973;


            sum *= x;

         //   sum /= (v[d] - 1);

            sum %= 9973;
        }
        d ++;
    }

    if(nr > 1)
    {
        if(nr != 9973)
        {

            y *= (nr - 1);

            y %= 9973;

            sum *= ((nr % 9973) * (nr % 9973) - 1);

         //   sum /= (nr - 1);

            sum %= 9973;
        }
        div *= 2;
    }

   // printf("%d\n", y);

    int i, rez = 0, j;

    euclid(y, 9973, rez, i, j);

    poz(rez, 9973);

    sum = sum * rez % 9973;

    fprintf(g, "%lld %lld\n", div, sum );
}

void readFile()
{
    f = fopen("ssnd.in", "r");
    g = fopen("ssnd.out", "w");

    int i;

    long long nr;

    fscanf(f, "%d", &n);

    for(i = 1; i <= n; i ++)
    {
        fscanf(f, "%lld", &nr);

        sumdiv(nr);
    }

    fclose(f);
    fclose(g);
}

int main()
{
    ciur();

    readFile();

    return 0;
}