// UVa 10856 - Recover Factorial
#include <iostream>
#include <string.h>
#include <vector>
#include <math.h>
#include <stdio.h>
using namespace std;
#define integer long long int
#define MaxX 2703664
bool isprime[MaxX + 1];
integer n;
integer T[MaxX + 1], P[MaxX + 1], F[MaxX + 1];
unsigned long long find(unsigned long long ini, integer fin) {
if (ini >= fin)
return ini;
unsigned long long mid = ((ini + fin) >> 1);
if (n <= T[mid])
return find(ini, mid);
else
return find(mid + 1, fin);
}
int main() {
memset(isprime, true, sizeof(isprime));
for (int i = 4; i <= MaxX; i += 2) {
isprime[i] = false;
F[i] = 2;
}
vector<integer> prime;
prime.push_back(2);
for (int i = 3; i <= 1830; i += 2)
if (isprime[i]) {
for (int j = i * i; j <= MaxX; j += (i << 1)) {
isprime[j] = false;
F[j] = i;
}
prime.push_back(i);
}
T[0] = 0;
T[1] = 0;
P[0] = 0;
P[1] = 0;
n = 0;
integer x;
for (x = 2; T[x - 1] <= 10000001; x++) {
if (isprime[x])
P[x] = 1;
else {
P[x] = P[x / F[x]] + 1;
}
T[x] = T[x - 1] + P[x];
}
int t = 0;
while ((cin >> n) && n >= 0) {
t++;
unsigned long long pos = find(0, MaxX);
if (T[pos] == n)
printf("Case %d: %llu!\n", t, pos);
else
printf("Case %d: Not possible.\n", t);
}
return 0;
}
Thursday, October 1, 2015
UVa 10856 - Recover Factorial
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment