Cod sursa(job #917807)

Utilizator dariusdariusMarian Darius dariusdarius Data 18 martie 2013 13:10:52
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#define mod 9901
#include<math.h>
using namespace std;
typedef long long i64;
i64 power(i64 a,i64 n,i64 k)
{
    i64 r=1;
    for(r=1,a=a%k;n;n>>=1)
    {
        if(n&1)
            r=(r*a)%k;
        a=(a*a)%k;
    }
    return r;
}
i64 invmod(i64 x)
{
    return power(x,mod-2,mod);
}
int main()
{
    freopen("sumdiv.in","r",stdin);
    freopen("sumdiv.out","w",stdout);
    i64 lim,e,d,a,b,rez=1,r=1,x,y;
    scanf("%lld%lld",&a,&b);
    if(a==0)
    {
        printf("0\n");
        return 0;
    }
    lim=(i64)sqrt(1.0*a);
    for(d=2;d<=lim && a>1;d++)
        if(a%d==0)
        {
            e=0;
            while(a%d==0) {a=a/d;e+=b;}
            x=(power(d,e+1,mod)+mod-1)%mod;
            y=(d-1)%mod;
            r=(x*invmod(y))%mod;
            rez=(rez*r)%mod;
        }
    if(a>1)
    {
        d=a;e=1;
        x=(power(d,e+1,mod)+mod-1)%mod;
        y=(d-1)%mod;
        r=(x*invmod(y))%mod;
        rez=(rez*r)%mod;
    }
    printf("%lld\n",rez);
    return 0;
}