Cod sursa(job #1903057)

Utilizator maria_sinteaMaria Sintea maria_sintea Data 4 martie 2017 22:49:07
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <cstdio>
#define n 9901

using namespace std;

int a, b;

int putere(int baza, long long int exp)
{
    int ans=1;
    baza%=n;
    for( ;exp;exp>>=1)
    {
        if(exp%2==1)
            ans=(ans*baza)%n;
        baza=(baza*baza)%n;
    }
    if(ans==0)
        ans+=n;
    return ans;
}

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, long long int f, int s)
{
    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=n+put%n;
    return ((s*(put-1)%n)*l)%n;
}

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

        if(p)
        {
            p*=b;
            if((d-1)%n==0)
                s=(s*(p+1)%n)%n;
            else
                s=prog(d, p, s)%n;
        }
        d+=2;
    }
    if(a>1)
    {
        p=b;
        d=a;
        if((d-1)%n==0)
            s=(s*((p+1)%n))%n;
        else
            s=prog(d, p, s);
    }
    return s;
}

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

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