-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path17394.cpp
70 lines (65 loc) · 1.33 KB
/
17394.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
bool era[100001];
bool visited[1000001];
int T;
int N, A, B;
int bfs() {
queue<pair<int, int>> que;
que.push(make_pair(N, 0));
visited[N] = true;
while (!que.empty()) {
int Num = que.front().first;
int Count = que.front().second;
que.pop();
if (Num >= A && Num <= B && !era[Num]) {
return Count;
}
if (!visited[Num / 3]) {
que.push(make_pair(Num / 3, Count + 1));
visited[Num / 3] = true;
}
if (!visited[Num / 2]) {
que.push(make_pair(Num / 2, Count + 1));
visited[Num / 2] = true;
}
if (!visited[Num + 1] && Num +1 <= 1000000) {
que.push(make_pair(Num + 1, Count + 1));
visited[Num + 1] = true;
}
if (!visited[Num - 1] && Num -1 >= 1) {
que.push(make_pair(Num - 1, Count + 1));
visited[Num - 1] = true;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
for (int x = 2; x <= sqrt(100000); x++) {
for (int y = x + x; y <= 100000; y += x) {
era[y] = true;
}
}
cin >> T;
while (T--) {
cin >> N >> A >> B;
memset(visited, 0, sizeof(visited));
bool sig = false;
for (int x = A; x <= B; x++) {
if (!era[x]) sig = true;
}
if (!sig) {
cout << -1 << "\n";
continue;
}
cout << bfs() << "\n";
}
return 0;
}