Cod sursa(job #1901752)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 4 martie 2017 10:59:21
Problema Suma divizorilor Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <iostream>
#include <cstdio>
#define MOD 9901
using namespace std;
long long a,b,sol=1;
long long invers(int al, int m)
{
    int m0=m, t, q;
    long long x0=0, x1=1;
    if (m==1)
      return 0;
    while (al>1)
    {
        q=al/m;
        t=m;
        m=al%m, al=t;
        t=x0;
        x0=x1-q*x0;
        x1=t;
    }
    if (x1 < 0)
       x1 += m0;
    return x1;
}
int pow(int baza, long long p)
{
    int s=1;
    while(p)
    {
        if(p%2==0)
            baza=(baza*baza)%MOD, p/=2;
        else
            s=(s*baza)%MOD, p--;
    }
    if(s==0)
        s+=MOD;
    return s;
}
void putere(int baza)
{
    long long p=0;
    while(a%baza==0 && a>1)
    {
        p++;
        a/=baza;
    }
    p*=b;
    if((baza-1)%MOD==0)
        sol=(sol*((p+1)%MOD))%MOD;
    else
        sol=(sol*(pow(baza,p+1)-1)%MOD*invers(baza-1,MOD))%MOD;
}
void prim()
{
    if(a%2==0)
        putere(2);
    if(a%3==0)
        putere(3);
    for(long long i=5;i*i<=a && a>1;i+=6)
    {
        if(a%i==0)
            putere(i);
        if(a%(i+2)==0)
            putere(i+2);
    }
    if(a>1)
        putere(a);
}
int main()
{
    freopen("sumdiv.in","r",stdin);
    freopen("sumdiv.out","w",stdout);
    scanf("%lld %lld", &a, &b);
    if(a==0)
        cout<<"0";
    else
        prim(), cout<<sol;
    return 0;
}