Cod sursa(job #789128)

Utilizator visanrVisan Radu visanr Data 16 septembrie 2012 23:33:13
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 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)
{
    if(!p) return 1;
    if(p & 1) return (n * lgput(n, p - 1)) % modulo;
    int x = lgput(n, p / 2);
    return (x * x) % modulo;
}

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)
         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;
    printf("%i\n", ans);
    return 0;
}