Tasks Details
medium
Calculate the number of elements of an array that are not divisors of each element.
Task Score
100%
Correctness
100%
Performance
100%
You are given an array A consisting of N integers.
For each number A[i] such that 0 ≤ i < N, we want to count the number of elements of the array that are not the divisors of A[i]. We say that these elements are non-divisors.
For example, consider integer N = 5 and array A such that:
A[0] = 3 A[1] = 1 A[2] = 2 A[3] = 3 A[4] = 6For the following elements:
- A[0] = 3, the non-divisors are: 2, 6,
- A[1] = 1, the non-divisors are: 3, 2, 3, 6,
- A[2] = 2, the non-divisors are: 3, 3, 6,
- A[3] = 3, the non-divisors are: 2, 6,
- A[4] = 6, there aren't any non-divisors.
Write a function:
vector<int> solution(vector<int> &A);
that, given an array A consisting of N integers, returns a sequence of integers representing the amount of non-divisors.
Result array should be returned as a vector of integers.
For example, given:
A[0] = 3 A[1] = 1 A[2] = 2 A[3] = 3 A[4] = 6the function should return [2, 4, 3, 2, 0], as explained above.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [1..50,000];
- each element of array A is an integer within the range [1..2 * N].
Copyright 2009–2025 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.
Solution
Programming language used C++
Time spent on task 3 minutes
Notes
not defined yet
Code: 19:58:48 UTC,
java,
autosave
Code: 20:00:14 UTC,
cpp,
autosave
Code: 20:00:24 UTC,
cpp,
autosave
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
vector<int> solution(vector<int> &A) {
const int N = A.size();
std::unordered_map<int, int> frequencies;
for (auto v : A) {
if (frequencies.find(v) == frequencies.end()) {
frequencies[v] = 1;
} else {
frequencies[v]++;
}
}
std::unordered_map<int, std::vector<int>> divisorsMap;
for (auto v : A) {
if (divisorsMap.find(v) == divisorsMap.end()) {
std::vector<int> divisors = list_divisors(v);
divisorsMap[v] = divisors;
}
}
std::vector<int> result(N);
for (int i = 0; i < N; ++i) {
int non_divisors = N;
int v = A[i];
std::vector<int> &divisors = divisorsMap[v];
for (int d : divisors) {
if (frequencies.find(d) != frequencies.end()) {
non_divisors -= frequencies[d];
}
}
result[i] = non_divisors;
}
return result;
}
Code: 20:00:35 UTC,
cpp,
autosave
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
// you can use includes, for example:
// #include <algorithm>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
std::vector<int> list_divisors(int n) {
std::vector<int> result;
result.push_back(1);
if (n > 1) {
int k = 2;
while(k * k <= n) {
if (n % k == 0) {
result.push_back(k);
int b = n / k;
if (b != k) {
result.push_back(b);
}
}
k ++;
}
result.push_back(n);
}
return result;
}
vector<int> solution(vector<int> &A) {
const int N = A.size();
std::unordered_map<int, int> frequencies;
for (auto v : A) {
if (frequencies.find(v) == frequencies.end()) {
frequencies[v] = 1;
} else {
frequencies[v]++;
}
}
std::unordered_map<int, std::vector<int>> divisorsMap;
for (auto v : A) {
if (divisorsMap.find(v) == divisorsMap.end()) {
std::vector<int> divisors = list_divisors(v);
divisorsMap[v] = divisors;
}
}
std::vector<int> result(N);
for (int i = 0; i < N; ++i) {
int non_divisors = N;
int v = A[i];
std::vector<int> &divisors = divisorsMap[v];
for (int d : divisors) {
if (frequencies.find(d) != frequencies.end()) {
non_divisors -= frequencies[d];
}
}
result[i] = non_divisors;
}
return result;
}
Code: 20:00:42 UTC,
cpp,
verify,
result: Passed
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
// you can use includes, for example:
//
#include <unordered_map>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
std::vector<int> list_divisors(int n) {
std::vector<int> result;
result.push_back(1);
if (n > 1) {
int k = 2;
while(k * k <= n) {
if (n % k == 0) {
result.push_back(k);
int b = n / k;
if (b != k) {
result.push_back(b);
}
}
k ++;
}
result.push_back(n);
}
return result;
}
vector<int> solution(vector<int> &A) {
const int N = A.size();
std::unordered_map<int, int> frequencies;
for (auto v : A) {
if (frequencies.find(v) == frequencies.end()) {
frequencies[v] = 1;
} else {
frequencies[v]++;
}
}
std::unordered_map<int, std::vector<int>> divisorsMap;
for (auto v : A) {
if (divisorsMap.find(v) == divisorsMap.end()) {
std::vector<int> divisors = list_divisors(v);
divisorsMap[v] = divisors;
}
}
std::vector<int> result(N);
for (int i = 0; i < N; ++i) {
int non_divisors = N;
int v = A[i];
std::vector<int> &divisors = divisorsMap[v];
for (int d : divisors) {
if (frequencies.find(d) != frequencies.end()) {
non_divisors -= frequencies[d];
}
}
result[i] = non_divisors;
}
return result;
}
Analysis
Code: 20:00:52 UTC,
cpp,
verify,
result: Passed
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
// you can use includes, for example:
//
#include <unordered_map>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
std::vector<int> list_divisors(int n) {
std::vector<int> result;
result.push_back(1);
if (n > 1) {
int k = 2;
while(k * k <= n) {
if (n % k == 0) {
result.push_back(k);
int b = n / k;
if (b != k) {
result.push_back(b);
}
}
k ++;
}
result.push_back(n);
}
return result;
}
vector<int> solution(vector<int> &A) {
const int N = A.size();
std::unordered_map<int, int> frequencies;
for (auto v : A) {
if (frequencies.find(v) == frequencies.end()) {
frequencies[v] = 1;
} else {
frequencies[v]++;
}
}
std::unordered_map<int, std::vector<int>> divisorsMap;
for (auto v : A) {
if (divisorsMap.find(v) == divisorsMap.end()) {
std::vector<int> divisors = list_divisors(v);
divisorsMap[v] = divisors;
}
}
std::vector<int> result(N);
for (int i = 0; i < N; ++i) {
int non_divisors = N;
int v = A[i];
std::vector<int> &divisors = divisorsMap[v];
for (int d : divisors) {
if (frequencies.find(d) != frequencies.end()) {
non_divisors -= frequencies[d];
}
}
result[i] = non_divisors;
}
return result;
}
Analysis
Code: 20:00:56 UTC,
cpp,
final,
score: 
100
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
// you can use includes, for example:
//
#include <unordered_map>
// you can write to stdout for debugging purposes, e.g.
// cout << "this is a debug message" << endl;
std::vector<int> list_divisors(int n) {
std::vector<int> result;
result.push_back(1);
if (n > 1) {
int k = 2;
while(k * k <= n) {
if (n % k == 0) {
result.push_back(k);
int b = n / k;
if (b != k) {
result.push_back(b);
}
}
k ++;
}
result.push_back(n);
}
return result;
}
vector<int> solution(vector<int> &A) {
const int N = A.size();
std::unordered_map<int, int> frequencies;
for (auto v : A) {
if (frequencies.find(v) == frequencies.end()) {
frequencies[v] = 1;
} else {
frequencies[v]++;
}
}
std::unordered_map<int, std::vector<int>> divisorsMap;
for (auto v : A) {
if (divisorsMap.find(v) == divisorsMap.end()) {
std::vector<int> divisors = list_divisors(v);
divisorsMap[v] = divisors;
}
}
std::vector<int> result(N);
for (int i = 0; i < N; ++i) {
int non_divisors = N;
int v = A[i];
std::vector<int> &divisors = divisorsMap[v];
for (int d : divisors) {
if (frequencies.find(d) != frequencies.end()) {
non_divisors -= frequencies[d];
}
}
result[i] = non_divisors;
}
return result;
}
Analysis summary
The solution obtained perfect score.
Analysis
Detected time complexity:
O(N * log(N))
expand all
Correctness tests
1.
0.001 s
OK
2.
0.001 s
OK
1.
0.001 s
OK
2.
0.001 s
OK
3.
0.001 s
OK
1.
0.001 s
OK
1.
0.001 s
OK
1.
0.001 s
OK
2.
0.001 s
OK
expand all
Performance tests
1.
0.008 s
OK
2.
0.004 s
OK
1.
0.032 s
OK
2.
0.008 s
OK
1.
0.052 s
OK
2.
0.016 s
OK
1.
0.036 s
OK
2.
0.008 s
OK
3.
0.012 s
OK