Cod sursa(job #2507348)

Utilizator victoreVictor Popa victore Data 10 decembrie 2019 02:15:28
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include<cstdio>

using namespace std;

const int nmax=100005;
const int mod=9901;

bool viz[nmax];
int d[nmax],k;

inline void gogo()
{
    int i,j;
    for(i=2;i<nmax;++i)
        if(!viz[i])
        {
            d[++k]=i;
            for(j=i;j<nmax;j+=i)
                viz[j]=1;
        }
}

inline int pow(int n,long long p)
{
    long long ans=1;
    n=n%mod;
    while(p)
    {
        if(p&1)
            ans = (ans*n) %mod;
        n=(n*n)%mod;
        p>>=1;
    }
    return ans;
}

int main()
{
    freopen("sumdiv.in","r",stdin);
    freopen("sumdiv.out","w",stdout);
    int sum=1,n,b,i;
    scanf("%d%d",&n,&b);
    long long p,top,bot;
    gogo();
    for(i=1;i<=k && d[i] * d[i] <= n;++i)
    {
        if(n%d[i])
            continue;
        p=0;
        while(n%d[i]==0)
        {
            n/=d[i];
            ++p;
        }
        p*=b;
        top=(pow(d[i],p+1) - 1)%mod;
        bot=pow(d[i]-1,mod-2) %mod;
        sum = (((sum*top)%mod)*bot)%mod;
    }
    if(n!=1)
    {
        if(n%mod==1)
            sum = (sum*(b+1))%mod;
        else
        {
            top=(pow(n,b+1)-1) %mod;
            bot=pow(n-1,mod-2)%mod;
            sum=(((sum*top)%mod)*bot)%mod;
        }
    }
    while(sum<0)
        sum = sum+mod;
    printf("%d",sum);
}