Cod sursa(job #757987)

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

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

#define P    9901ll

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;
}

int inv(int a) {
  int result = pow(a, P - 2);
  if (mul(result, a) != 1) {
    printf("BUG!!!!!!!!\n");
    printf("%d %d %d\n", a, result, mul(result, a));
    for(;;);
  }
  return result;
}

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

int sum_prim(int a, int e) {
  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));

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

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