Cod sursa(job #652132)

Utilizator daniel.dumitranDaniel Dumitran daniel.dumitran Data 23 decembrie 2011 04:32:48
Problema Numere 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include "../template/include/bigint.h"

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

#define MAXLEN  100
#define MAXPOW  4 * MAXLEN

int bad_prime[MAXPOW];

BigInt fastExp(BigInt num, int pow) {
  if (pow == 0) { return BigInt(1); }
  if (pow == 1) { return num; }

  BigInt sqrt = fastExp(num, pow / 2);
  BigInt temp = sqrt * sqrt;
  return (pow & 1) ? temp * num : temp;
}

int main() {
  FILE *fin = fopen(FISIN, "rt");
  FILE *fout = fopen(FISOUT, "wt");

  char buffer[128];
  fscanf(fin, "%s", buffer);
  BigInt target(buffer);
  int power = 1;

  for (int i = 2; i < MAXPOW; ++i) {
    if (bad_prime[i]) continue;
    for (int j = i * 2; j < MAXPOW; j += i)
      bad_prime[j] = 1;

    BigInt st(1);
    BigInt en(target);
    
    while (st <= en) {
      BigInt mid = st + en;
      mid /= 2;

      BigInt pow = fastExp(mid, i);

      if (pow == target) {
	power *= i;
	target = mid;
	--i;
	break;
      }

      if (pow < target) {
	st = mid + 1;
      } else {
	en = mid + (-1);
      }
    }
  }

  std::string output; target.print(output);
  
  fprintf(fout, "%s\n%d\n", output.c_str(), power);

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