Ranking (as of 2014-08-31): 144 out of 569
Language: C++
/*
UVa 11086 - Composite Prime
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_11086_Composite_Prime.cpp
*/
/*
4
3 4 6 8
3 3 is a prime number
4 = 2 * 2
6 = 2 * 3
8 = 2 * 4 4 is an element in M
5
12 13 21 22 23
12 = 3 * 4 4 is an element in M
13 13 is a prime number
21 = 3 * 7
22 = 3 * 11
23 23 is a prime number
*/
#include <iostream>
#include <cmath>
using namespace std;
const int n_max = 1048576;
bool not_primes[n_max + 1]; // not_primes[i] is true if i is not a prime
bool not_composite_primes[n_max + 1];
// composite_primes[i] is true if i is not a composite prime
void sieve_of_eratosthenes()
{
not_primes[0] = not_primes[1] = true;
for (int i = 2, e = static_cast<int>(sqrt(static_cast<double>(n_max)));
i <= e; i++)
if (!not_primes[i]) {
for (int j = i * i; j <= n_max; j += i)
not_primes[j] = true;
}
}
void composite_primes()
{
not_composite_primes[0] = not_composite_primes[1] =
not_composite_primes[2] = not_composite_primes[3] = true;
for (int i = 4; i <= n_max; i++)
if (not_primes[i] && !not_composite_primes[i]) {
for (int j = i * 2; j <= n_max; j += i)
not_composite_primes[j] = true;
}
}
int main()
{
sieve_of_eratosthenes();
composite_primes();
#ifdef DEBUG
int nr_composite_primes = 0;
for (int i = 4; i <= n_max; i++)
if (not_primes[i] && !not_composite_primes[i])
nr_composite_primes++;
cout << nr_composite_primes << endl; // 219759
#endif
int K;
while (cin >> K) {
int nr = 0;
while (K--) {
int n;
cin >> n;
if (not_primes[n] && !not_composite_primes[n])
nr++;
}
cout << nr << endl;
}
return 0;
}