Cod sursa(job #1794050)

Utilizator Coroian_DavidCoroian David Coroian_David Data 31 octombrie 2016 20:41:46
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <iostream>

#include <cstdio>

using namespace std;

FILE *f, *g;

int a, b, k;

bool p[7101];

int pr[1001];

void readFile()
{
    f = fopen("sumdiv.in", "r");

    fscanf(f, "%d%d", &a, &b);

    fclose(f);
}

void ciur()
{
    int n = 7100;

    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;
        }
    }

    pr[++ k] = 2;

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

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

    for(i = 0; (1 << i) <= b; i ++)
    {

        if(((1 << i) & b) > 0)
        {
            p = (p * c) % 9901;
        }

        c *= c;

        c %= 9901;
    }

    return p;
}

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

        x = 1;

        y = 0;

        return;
    }

    int xx, yy, q = a / b;

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

    x = yy;

    y = xx - yy * q;
}

int s = 1;

int poz(int &a, int n)
{
    if(a < 0)
    {
        a = n + a % n;
    }
}

void solve()
{
    ciur();

    int d, i, j, rez, p, y;

    d = 1;

    while(d <= k && pr[d] * pr[d] <= a)
    {
        p = 0;

        while(a % pr[d] == 0)
        {
            a /= pr[d];

            p ++;
        }

        if(p != 0)
        {
            p *= b;

           // printf("p = %d\n", p);

            s *= (putere(pr[d], p + 1) - 1);

            s %= 9901;

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

            y = pr[d] - 1;

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

            rez %= 9901;

            poz(rez, 9901);

            s *= rez;

            s %= 9901;

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

        d ++;
    }

    if(a > 1)
    {
        if(a != 9901)
        {
            s *= (putere(a, b + 1) - 1);

           // printf("*%d\n", putere(2, 3));

            s %= 9901;

           // printf("%d", s);

            y = a - 1;

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

            rez %= 9901;

            poz(rez, 9901);

            s *= rez;

            s %= 9901;
        }
    }
}

void printFile()
{
    g = fopen("sumdiv.out", "w");

    fprintf(g, "%d\n", s);

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}