Cod sursa(job #1070936)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 2 ianuarie 2014 12:39:02
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <fstream>
#include <cstring>

#define mod 9901

using namespace std;

ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");

long long a,b,t,p[10001];
long long sum = 1;

long long lgpow (long long a, long long b)
{
    if (b==0)
        return 1;
    long long x = lgpow(a,b/2);
    if (b%2)
        return x*x%mod*a%mod;
    return x*x%mod;
}

void sieve (int n)
{
    bool comp[10001];
    memset (comp,0,sizeof(comp));

    p[++t] = 2;

    for (int i=3; i<=n; i+=2)
    {
        if (!comp[i])
        {
            p[++t] = i;

            for (int j=i*i; j<=n; j+=i)
            {
                comp[j] = 1;
            }
        }
    }
}

int main()
{
    fin>>a>>b;

    sieve (10000);

    for (int i=1; i<=t && p[i]*p[i] <= a; ++i)
    {
        if (a % p[i] != 0)
            continue;

        long long po=0;

        while (a%p[i]==0)
        {
            a /= p[i];
            ++po;
        }

        long long f1 = (lgpow (1LL*p[i],1LL*po*b+1)-1)%mod;

        if (f1 < 0) f1 += mod;

        long long f2 = lgpow (1LL*p[i]-1,1LL*mod-2);

        sum = sum*f1%mod*f2%mod;
    }

    if (a!=1)
    {
        long long f1 = (lgpow (1LL*a,1LL*b+1)-1)%mod;
        if (f1 < 0) f1 += mod;

        long long f2 = lgpow (1LL*a-1,1LL*mod-2);

        sum = sum*f1%mod*f2%mod;
    }

    fout<<sum;
}