Cod sursa(job #1794600)

Utilizator Coroian_DavidCoroian David Coroian_David Data 1 noiembrie 2016 15:33:12
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <iostream>

#include <cstdio>

#define MOD 9901

using namespace std;

FILE *f, *g;

long long a, b;

int  k;

bool p[7101];

int pr[1001];

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

    fscanf(f, "%lld%lld", &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(long long a, long long b)
{
    int p = 1, i;

    long long c = a;

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

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

        c *= c;

        c %= MOD;
    }

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

long long 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 = %lld d = %lld\n", p, pr[d]);

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

            s %= MOD;

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

            y = pr[d] - 1;

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

            rez %= MOD;

            poz(rez, MOD);

            s *= rez;

            s %= MOD;

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

        d ++;
    }

    if(a > 1)
    {
        if(a != MOD)
        {
//            printf("%d\n", s);

            s *= (putere(a, b + 1) - 1);

//            printf("*%d %lld\n", a, putere(a, b + 1));

            s %= MOD;

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

            y = a - 1;

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

            rez %= MOD;

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

            poz(rez, MOD);

            s *= rez;

            s %= MOD;
        }
    }
}

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

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

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}