Cod sursa(job #757995)

Utilizator daniel.dumitranDaniel Dumitran daniel.dumitran Data 14 iunie 2012 00:24:39
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define FISIN   "sumdiv.in"
#define FISOUT  "sumdiv.out"

#define P    9901ll

inline int mul(int a, int b) {
  long long x = (long long)a * (long long)b;
  return x % P;
}

int pow(int a, int e) {
  if (!e) return 1;
  int temp = pow(a, e / 2);
  temp = mul(temp, temp);
  if (e & 1) temp = mul(temp, a);
  return temp;
}

inline int inv(int a) {
  return pow(a, P - 2);
}

inline int add(int a, int b) { return (a + b) % P; }

int sum_prim(int a, int e) {
  if (a % P == 1) { return (e + 1) % P; }
  int numa = add(pow(a, e + 1), (P - 1));
  int numi = add(a, (P - 1));
  return mul(numa, inv(numi));
}

int main() {
  FILE *fin = fopen(FISIN, "rt");
  FILE *fout = fopen(FISOUT, "wt");
  
  int a, b;
  fscanf(fin, "%d %d", &a, &b);
  
  int result = 1;
  for (int i = 2; i * i <= a; ++i) {
    if (a % i) continue;

    int pow = 0;
    for (; !(a % i); ++pow) a/= i;

    result = mul(result, sum_prim(i, pow * b));
  }
  
  if (a != 1) result = mul(result, sum_prim(a, b));

  fprintf(fout, "%d\n", result);

  fclose(fout);
  fclose(fin);
  return 0;
}