Cod sursa(job #3236660)

Utilizator alexvali23alexandru alexvali23 Data 30 iunie 2024 09:28:39
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<fstream>
#define PRIMMAX 7200
#define NRPRIME 930
#define MOD 9901

using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
bool ciur_v[PRIMMAX];
int prim[NRPRIME];
int nrPrime=1,S=1;
int A,B;
void ciur()
{
    int i,j;
    prim[nrPrime]=2;
    for(i=3; i<PRIMMAX-1; i+=2)
        if(!ciur_v[i])
        {
            prim[++nrPrime]=i;
            for(j=3 * i; j<PRIMMAX-1; j+=2*i)
                ciur_v[j]=1;
        }
}
int powlg(int N, long long P)
{
    int sol=1;
    N%=MOD;
    while(P)
    {
        if(P&1)
            sol=(sol*N)%MOD;
        N=(N*N)%MOD;
        P>>=1;
    }
    return sol;
}
int sumDiv(int nr, int exp)
{
    if(nr%MOD==1)
        return exp*B+1;
    return (powlg(nr,1LL*exp*B+1)+MOD-1)*(powlg(nr-1,MOD-2))%MOD;
}
int main()
{
    ciur();
    f>>A>>B;
    for(int i=1; (prim[i]*prim[i]<=A)&&(i<=nrPrime); i++)
    {
        if(A%prim[i]==0)
        {
            int exp =0;
            while(A%prim[i]==0)
            {
                A/=prim[i];
                exp++;
            }
            S=(S*sumDiv(prim[i],exp))%MOD;
        }
    }
    if(A!=1)
        S=(S*sumDiv(A,1))%MOD;
    g<<S;
    return 0;
}