Cod sursa(job #1794680)

Utilizator Coroian_DavidCoroian David Coroian_David Data 1 noiembrie 2016 16:54:42
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.25 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 % MOD;

    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;

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

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

            s %= MOD;

            //printf("%lld\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("/////a = %d\n", a);
          // printf("++++++%lld\n", s);
           // printf("++++++++%d\n", putere(a, b + 1));

            if(a % MOD > 1)
            {

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

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

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

            else
            {
                s *= (b + 1);

                s %= MOD;
            }


        }
    }
}

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

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

    fclose(g);
}

int main()
{


    readFile();

    solve();

    printFile();

   // printf("%d %d %d %d %d\n", putere(2, b + 1), putere(3, b + 1), putere(5, b + 1), putere(7, b + 1), putere(59407, b + 1));
  //  printf("%d %d %d %d %d\n", putere(2, b + 1), putere(3, b + 1), putere(5, b + 1), putere(7, b + 1), putere(59407, b + 1));


    return 0;
}