Cod sursa(job #1900557)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 3 martie 2017 14:46:06
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <cstdio>
#define n 9901

using namespace std;

long long int a, b, nr;

int putere(int a, 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);
    return ((putere(p, f+1)-1)*l)%n;
}

int sdiv()
{
    int s=1, d=3, p=0;
    while(a%2==0)
    {
        p++;
        a/=2;
    }
    if(p)
        s=(s*prog(2, p*b))%n;
    while(d*d<=a)
    {
        p=0;
        while(a%d==0)
        {
            p++;
            a/=d;
        }
        if(p)
            s=(s*prog(d, p*b))%n;
        d+=2;
    }
    if(a>1)
        s=(s*prog(a, b))%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();
          if(rez<0)
             rez+=9901;
          printf("%d", rez);
       }
    return 0;
}