Cod sursa(job #2189847)

Utilizator timar_andreiTimar Andrei timar_andrei Data 29 martie 2018 10:35:48
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>

#define MAX 50000002
#define MOD 9901

using namespace std;

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

int A,B,K;
int V[MAX],P[MAX];

void Ciur()
{
    for(int i=2;i<MAX;i++)
    {
        if (V[i] == 0)
        {
            P[++K] = i;
            for(int j=i+i;j<MAX;j+=i)
                V[i] = 1;
        }
    }
}

int pow(int x,int p)
{
    int rez = 1;
    x %= MOD;
    while(p)
    {
        if (p % 2)
        {
            rez *= x;
            rez %= MOD;
        }
        x *= x;
        x %= MOD;

        p /= 2;
    }

    return rez;
}
void Solve()
{
    int suma = 1;
    for(int i=1;i<=K  && 1LL*P[i]*P[i] <= A;i++)
    {
        if (A%P[i]) continue;

        int  p = 0;
        while(A%P[i] == 0)
        {
            p++;
            A /= P[i];
        }

        int a,b;
        a = (pow(P[i],(p+1)) - 1) % MOD;
        b = pow(P[i]-1, (MOD-2)) % MOD;

        suma = (((suma*a)%MOD)*b)%MOD;
    }
    if (A > 1)
    {
        suma = (suma*(A+1)) % MOD;
    }
    cout<<suma;
}

int main()
{
    fin>>A>>B;
    Ciur();
    A = pow(A,B);
    Solve();
    return 0;
}