Cod sursa(job #1505497)

Utilizator hrazvanHarsan Razvan hrazvan Data 19 octombrie 2015 11:52:13
Problema Suma divizorilor Scor 80
Compilator c Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <stdio.h>
#define MAXP 9
#define MOD 9901
int d[MAXP];
long long p[MAXP];

inline int ptr(int a, long long b, int mod){
  a %= mod;
  int rez = 1;
  while(b > 0){
    if(b & 1){
      rez *= a;
      rez %= mod;
    }
    a *= a;
    a %= mod;
    b /= 2;
  }
  return rez;
}

int main(){
  FILE *in = fopen("sumdiv.in", "r");
  int a, b, i, dr = 0;
  fscanf(in, "%d%d", &a, &b);
  for(i = 2; i * i <= a; i++){
    if(a % i == 0){
      d[dr] = i;
      while(a % i == 0){
        a /= i;
        p[dr]++;
      }
      p[dr] *= b;
      dr++;
    }
  }
  if(a > 1){
    d[dr] = a;
    p[dr] = b;
    dr++;
  }
  fclose(in);
  int rez = 1, x;
  for(i = 0; i < dr; i++){
    x = ptr(d[i], p[i] + 1, MOD) - 1;
    if(x < 0)
      x += MOD;
    rez *= x;
    rez %= MOD;
    x = ptr(d[i] - 1, MOD - 2, MOD);
    rez *= x;
    rez %= MOD;
  }
  FILE *out = fopen("sumdiv.out", "w");
  fprintf(out, "%d", rez);
  fclose(out);
  return 0;
}