Cod sursa(job #3256327)

Utilizator andreiciocanCiocan Andrei andreiciocan Data 14 noiembrie 2024 10:09:25
Problema Suma divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb

#include <fstream>
using namespace std;
ifstream cin("sumdiv.in");
ofstream cout("sumdiv.out");
const int M=9901;
int phi(int n)
{
    int r=n ,d=2;
    while(d*d<n)
    {
        if(n%d == 0)
        {
            r=r/d*(d - 1);
            while(n%d==0)
                n/=d;
        }
        d++;
    }
    if (n != 1)
    {
        r=r/n*(n - 1);
    }
    return r;
}

int plog(int p,int d)
{
    int P=1;
    d%=M;
    while(p!=0)
    {
        if(p%2==1){
            P=P*d;
            P=P%M;
            if(P==0)
                P=M;
        }
       d=d*d%M;
        p/=2;
    }
    return P;
}
int invers(int a, int fi)
{
    return plog(a,fi-1);
}
int main()
{
    int a,b;
    cin>>a>>b;
    long long d=2,suma=1;
    int fi=phi(M);
    while(d*d<=a)
    {
        if(a%d==0)
        {
            int p=0;
            while(a%d==0)
            {
                p++;
                a/=d;
            }
            if((d-1)%M!=0)
                suma=(long long)(suma*(plog(d,p*b+1)-1+M)*invers(d - 1,fi))%M;
            else
            {
                suma=(long long)(suma*(p*b+1))%M;
            }
        }
        d++;
    }
    if(a!=1)
    {
        if (a%M!=1)
        {
            suma=((long long)suma*(plog(a,b+1)-1+M)*invers(a-1,fi))%M;
        }
        else
            suma=((long long)suma*(b + 1))%M;
    }
    cout<<suma;
    return 0;
}