Cod sursa(job #1254906)

Utilizator MaarcellKurt Godel Maarcell Data 3 noiembrie 2014 18:15:38
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <iostream>
#include <fstream>
#define prim 9901LL
#define LL long long int
using namespace std;

LL A,B;

LL fpow(LL nr, LL p){
    LL res=1,i;
    for (i=1; i<=p; i<<=1){
        if (p&i)
            res=(res*nr)%prim;
        nr=(nr*nr)%prim;
    }

    return res;
}

LL inv(LL nr){
    return fpow(nr,prim-2);
}

LL get_sum(){
    LL i,cnt,res=1;
    for (i=2; i*i<=A; i++)
        if (A%i==0){
            cnt=0;
            while(A%i==0)
                cnt++,A/=i;
            res=(((res*(fpow(i,cnt*B+1)-1+prim))%prim)*inv(i-1))%prim;
        }

    if (A>1)
        if (A%prim==1)
            res=(res*(B+1))%prim;
        else
            res=(((res*(fpow(A,B+1)-1+prim))%prim)*inv(A-1))%prim;

    //if (inv(A-1)==0) cout << A;

    return res;
}

int main(){
    ifstream in("sumdiv.in");
    ofstream out("sumdiv.out");
    in >> A >> B;
    out << get_sum();

    return 0;
}