Cod sursa(job #405683)

Utilizator DraStiKDragos Oprica DraStiK Data 28 februarie 2010 17:06:32
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <algorithm>
#include <vector>
#include <bitset>
using namespace std;

#define pb push_back
#define MAX 10005
#define MOD 9901

vector <long long> prim;
bitset <MAX> viz;
long long n,m,sd;

void ciur ()
{
    int i,j;

    for (i=2; i<MAX; ++i)
        if (!viz[i])
        {
            prim.pb (i);
            for (j=i; j<MAX; j+=i)
                viz[j]=1;
        }
}

long long lgput (long long n,long long p)
{
    long long rez;

    n%=MOD;
    for (rez=1; p; p>>=1)
    {
        if (p&1)
            rez=(rez*n)%MOD;
        n=(n*n)%MOD;
    }

    return rez;
}

void solve ()
{
    long long i,exp;

    sd=1;
    for (i=0; prim[i]*prim[i]<=n; ++i)
        if (n%prim[i]==0)
        {
            for (exp=0; n%prim[i]==0; n/=prim[i])
                ++exp;
            exp*=m;
            sd=((sd*(lgput (prim[i],exp+1)+MOD-1))%MOD*lgput (prim[i]-1,MOD-2))%MOD;
        }
    if (n>1)
        sd=((sd*(lgput (n,m+1)+MOD-1))%MOD*lgput (n-1,MOD-2))%MOD;
    printf ("%lld",sd);
}

int main ()
{
    freopen ("sumdiv.in","r",stdin);
    freopen ("sumdiv.out","w",stdout);

    ciur ();
    scanf ("%lld%lld",&n,&m);
    solve ();

    return 0;
}