Cod sursa(job #789134)

Utilizator visanrVisan Radu visanr Data 16 septembrie 2012 23:40:35
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;

#define modulo 9901

int A, B, ans = 1, V[1010], P[1010], cnt;

int lgput(int N, int P)
{
    int sol = 1;
    N %= modulo;
    while(P > 0)
    {
        if(P & 1) sol = (sol * N) % modulo;
        N = (N * N) % modulo;
        P >>= 1;
    }
    return sol;
}

int main()
{
    freopen("sumdiv.in", "r", stdin);
    freopen("sumdiv.out", "w", stdout);
    int i, j;
    scanf("%i %i", &A, &B);
    for(i = 2; i * i <= A; i++)
    {
          int exp = 0;
          while(A % i == 0)
                  exp ++, A /= i;
          if(exp)
                 V[++cnt] = i, P[cnt] = exp * B;
    }
    if(A > 1)
         V[++cnt] = A, P[cnt] = B;
    for(i = 1; i <= cnt; i++)
          if(V[i] % modulo == 1)
                  ans = ans * ((P[i] + 1) % modulo) % modulo;
          else
              ans = (ans * (lgput(V[i], P[i] + 1) - 1 + modulo) % modulo * lgput(V[i] - 1, modulo - 2)) % modulo;
    if(A == 0) ans = 0;
    printf("%i\n", ans);
    return 0;
}