Cod sursa(job #2273350)

Utilizator verde.cristian2005Verde Flaviu-Cristian verde.cristian2005 Data 31 octombrie 2018 14:19:13
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
using namespace std;
ifstream in("sumdiv.in");
ofstream out("sumdiv.out");
const long long MOD=9901;
long long a,b;
long long lgput(long long n,long long k)
{
    long long rez=1;
    while(k)
    {
        if(k%2)
            rez=(long long)(rez*n)%MOD;
        n=(long long)(n*n)%MOD;
        k/=2;
    }
    return rez%MOD;
}
long long suma(long long n,long long k)
{
 int rez=0;
 for(int i=0;i<=k;i++)
 rez=(long long)(rez+lgput(n,i))%MOD;
 return rez;
}
void desc()
{
    long long d=2,rezfin=1,cnt=0;
    while(d*d<=a)
    {
        cnt=0;
        while(a%d==0)
        {
            a/=d;
            cnt++;
        }
        if(d%MOD!=1)
        rezfin=(long long)((long long)((rezfin*(lgput(d,cnt*b+1)-1+MOD)%MOD))*(lgput(d-1,MOD-2)+MOD))%MOD;
        else
        rezfin=(long long)(rezfin*suma(d,b))%MOD;
        d++;
    }
    if(a!=1)
    {
        if(a%MOD!=1)
        rezfin=(long long)((long long)((rezfin*(lgput(a,b+1)-1+MOD)%MOD))*(lgput(a-1,MOD-2)+MOD))%MOD;
        else
        rezfin=(long long)(rezfin*suma(a,b))%MOD;
    }
    out<<rezfin%MOD;
}
int main()
{
    in>>a>>b;
    if(b==0)
    {
        out<<1;
        return 0;
    }
    if(a==0)
    {
        out<<0;
        return 0;
    }
    desc();
    return 0;
}