Cod sursa(job #1933589)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 20 martie 2017 20:17:10
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <fstream>
#define VAL 8005
#define MOD 9901

using namespace std;

ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");

int A, B, i, j, x, y;
int v[VAL], K, e, nr;
int ans;
bool ok[VAL], gas;

void Sieve()
{
    for (i=2; i<VAL; i++)
    {
        if (ok[i]==false)
        {
            v[++K]=i;
            for (j=i*i; j<VAL; j+=i)
              ok[j]=true;
        }
    }
}

void Modular_Reverse(int &x, int &y, int A, int B)
{
    if (B==0)
      x=1, y=0;
    else
    {
        Modular_Reverse(x, y, B, A % B);
        int aux=x;
        x=y;
        y=aux-y*(A / B);
    }
}

int putere(int nr, int e)
{
    int P=1;
    nr%=MOD;
    while (e!=0)
    {
        if (e % 2==1)
        {
            e--;
            P*=nr;
            P%=MOD;
        }
        e/=2;
        nr*=nr;
        nr%=MOD;
    }
    P--;
    if (P==-1)
      P+=MOD;
    return P;
}

int main()
{
    fin >> A >> B;
    Sieve();
    ans=1;
    for (i=1; v[i]*v[i]<=A; i++)
    {
        if (A % v[i]==0)
        {
            e=0;
            while (A % v[i]==0)
            {
                e++;
                A/=v[i];
            }
            if (v[i] % MOD!=1)
            {
                ans*=putere(v[i], e*B+1);
                ans%=MOD;
                x=y=0;
                Modular_Reverse(x, y, v[i]-1, MOD);
                if (x<0)
                  x=MOD+(x % MOD);
                ans*=x;
                ans%=MOD;
            }
            else
            {
                ans*=e*B+1;
                ans%=MOD;
            }
        }
        if (A==1)
          break;
    }
    if (A>1)
    {
        if (A % MOD!=1)
        {
            ans*=putere(A, B+1);
            ans%=MOD;
            x=y=0;
            Modular_Reverse(x, y, A-1, MOD);
            if (x<0)
              x=MOD+(x % MOD);
            ans*=x;
            ans%=MOD;
        }
        else
        {
            ans*=B+1;
            ans%=MOD;
        }
    }
    fout << ans << '\n';
    fin.close();
    fout.close();
    return 0;
}