Cod sursa(job #2675677)

Utilizator Diana_IonitaIonita Diana Diana_Ionita Data 22 noiembrie 2020 12:25:08
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>
using namespace std;
long long  divi[10], expp[10];

long long descompunere(long long n)
{
    long long d=2,e,x,nrdiv=0;
    while (n>=d*d)
    {
        e = 0;
        while (n%d==0)
        {
            e++;
            n/=d;
        }
        if (e>0)
        {
            divi[nrdiv]=d;
            expp[nrdiv]=e;
            x=nrdiv;
            nrdiv=x+1;
        }
        d++;
    }
    if (n>1)
    {
        divi[nrdiv]=n;
        expp[nrdiv]=1;
        x=nrdiv;
        nrdiv=x+1;
    }
    return nrdiv;
}

long long putere(long long a,long long b)
{
    long long  put=1;
    while (b>0)
    {
        if (b%2==1)
            put=(long long)put*a%9901;
        a=(long long)a*a%9901;
        b /= 2;
    }
    return put;
}

int main()
{
    long long a,b,nrdiv,i;
    long long invs,put,s;
    freopen( "sumdiv.in", "r",stdin );
    freopen( "sumdiv.out", "w",stdout );
    scanf("%lld%lld", &a, &b );
    nrdiv=descompunere(a);
    s=1;
    for (i=0; i<nrdiv; i++)
    {
        if (divi[i]%9901==1)
        {
            s=(long long )s*(expp[i]*b+1)% 9901;
        }
        else
        {
            put=putere(divi[i],expp[i]*b+1);
            put-=1;
            if (put==-1)
            {
                put=9900;
            }
            invs=divi[i]-1;
            invs=putere(invs,9901-2);
            put=(long long)put *invs%9901;
            s=((long long)s*put)%9901;
        }
    }
    printf("%lld",s);
    return 0;
}