Ranking (as of 2013-01-20): 43
Language: C++
/*
UVa 10539 - Almost Prime Numbers
To build using Visual Studio 2008:
cl -EHsc -O2 UVa_10539_Almost_Prime_Numbers.cpp
*/
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cmath>
#ifdef __ELAPSED_TIME__
#include <ctime>
#endif
using namespace std;
const long long n_max = 1000000000000;
const int sqrt_n_max = 1000000;
bool not_primes[sqrt_n_max + 1]; // not_primes[i] is true if i is not a prime
const int nr_almost_primes_max = 100000;
long long almost_primes[nr_almost_primes_max];
void sieve_of_eratosthenes()
{
for (int i = 2, e = static_cast<int>(sqrt(static_cast<double>(sqrt_n_max)));
i <= e; i++)
if (!not_primes[i]) {
for (int j = i * i; j <= sqrt_n_max; j += i)
not_primes[j] = true;
}
}
int main()
{
#ifdef __ELAPSED_TIME__
clock_t start = clock();
#endif
sieve_of_eratosthenes();
int nr_almost_primes = 1;
for (long long j = 4; j <= n_max; j <<= 1)
almost_primes[nr_almost_primes++] = j;
for (int i = 3; i <= sqrt_n_max; i += 2) {
if (!not_primes[i]) {
long long j = i;
for (j *= j; j <= n_max; j *= i)
almost_primes[nr_almost_primes++] = j;
}
}
#ifdef DEBUG
cout << nr_almost_primes << endl;
#endif
sort(almost_primes, almost_primes + nr_almost_primes);
int N;
cin >> N;
while (N--) {
long long low, high;
cin >> low >> high;
int li = distance(almost_primes,
upper_bound(almost_primes, almost_primes + nr_almost_primes, low - 1));
int hi = distance(almost_primes,
upper_bound(almost_primes, almost_primes + nr_almost_primes, high));
cout << hi - li << endl;
}
#ifdef __ELAPSED_TIME__
cerr << "elapsed time = " <<
static_cast<double>(clock() - start) / CLOCKS_PER_SEC << " sec.\n";
#endif
return 0;
}
No comments:
Post a Comment