Cod sursa(job #1902917)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 4 martie 2017 20:54:02
Problema Suma divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>
#define n 9901

using namespace std;

long long int a, b, nr;

int putere(int a, long long int b)
{
    if(b==0)
        return 1;
    if(b%2==0)
        return putere(a*a, b/2)%n;
    return a*putere(a, b-1)%n;
}

void inv(int a, int b, int &k, int &l)
{
    if(b==0)
    {
        l=1;
        k=0;
        return;
    }
    int k1, l1;
    inv(b, a%b, k1, l1);
    l=k1;
    k=l1-(a/b)*k1;
}

int prog(int p, int f)
{
    int k, l;
    inv(p-1, n, k, l);
    if(l<=0)
        l=n+l%n;
    int put=putere(p%n, f+1);
    if(put==0)
        put+=mod;
    return ((put-1)%n)*l)%n;
}

int sdiv()
{
    int d=2, s=1;
    long long p;
    while((long long))d*d<=a && a>1)
    {
        p=0;
        while(a%d==0)
        {
            p++;
            a/=d;
        }
        if(p)
        {
            if((d-1)%n==0)
                s=(s*((p*b+1)%n))%n;
            else
                s=(s*prog(d, (p*b)%n))%n;
        }
        d++;
    }
    if(a>1)
    {
        p=b;
        d=a;
        if((d-1)%n==0)
            s=(s*((p+1)%n))%n;
        else
            s=(s*prog(d, p))%n;
    }
    return s;
}

int main()
{
    freopen("sumdiv.in", "r", stdin);
    freopen("sumdiv.out", "w", stdout);

    scanf("%lld %lld", &a, &b);
    a=a%n, b=b%n;
    if(a==0)
        printf("0");
    else
       {
          int rez=sdiv();
          printf("%d", rez);
       }
    return 0;
}