#include <stdio.h> #include <string.h> #include <cmath> #include <queue> #include <vector> #include <cstdlib> using namespace std; typedef unsigned long long ull; typedef pair<ull, int> par; const ull LIMIT = 18446744073709551615ULL; // = 2^64 - 1 const ull TWO_TO_16 = 1 << 16; // = 2^16 const ull TWO_TO_8 = 1 << 8; // = 2^8 ull pow(ull base, int exponent) { ull result = 1ULL; while (exponent) { if (exponent & 1) { result *= base; exponent ^= 1; } base *= base; exponent >>= 1; } return result; } class CompareCandidate { public: bool operator()(const par & a, const par & b) { return pow(a.first, a.second) > pow(b.first, b.second); } }; int main() { bool is_power[TWO_TO_16]; memset(is_power, false, sizeof(is_power)); for (ull i = 2; i < TWO_TO_8; i++) if (!is_power[i]) { for (ull j = i * i; j < TWO_TO_16; j *= i) is_power[j] = true; } int max_exponent[TWO_TO_16]; for (ull i = 2; i < TWO_TO_16; i++) if (!is_power[i]) { max_exponent[i] = ceil(64 / (log(i) / log(2))) - 1; } int next_compositive[65], previous = 4; for (int i = 6; i <= 65; i++) { bool is_compositive = false; for (int j = 2; j < i; j++) if (i % j == 0) { is_compositive = true; break; } if (is_compositive) { next_compositive[previous] = i; previous = i; } } // add to candidates all x^4 where x is not a power priority_queue<par, vector<par>, CompareCandidate> candidates; for (ull i = 2; i < TWO_TO_16; i++) if (!is_power[i]) candidates.push(make_pair(i, 4)); printf("1\n"); // take smallest candidate x^n, print it, add x^m as candidate where m is next compositive greater than n // add x*m as candidate only if m < log(x, MAX) while (!candidates.empty()) { par candidate = candidates.top(); candidates.pop(); printf("%llu\n", pow(candidate.first, candidate.second)); int m = next_compositive[candidate.second]; if (m <= max_exponent[candidate.first]) candidates.push(make_pair(candidate.first, m)); } return 0; }
Thursday, April 23, 2015
UVa 11752 - The Super Powers
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment