Pagini recente » Cod sursa (job #488162) | Cod sursa (job #913868) | Cod sursa (job #239895) | Cod sursa (job #1467526) | Cod sursa (job #652132)
Cod sursa(job #652132)
#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;
}