Task: | Collatz Conjecture |
Sender: | Antti Röyskö |
Submission time: | 2017-10-24 21:44:47 +0300 |
Language: | C++ |
Status: | READY |
Result: | ACCEPTED |
test | verdict | time | |
---|---|---|---|
#1 | ACCEPTED | 0.47 s | details |
#2 | ACCEPTED | 0.85 s | details |
#3 | ACCEPTED | 0.69 s | details |
#4 | ACCEPTED | 0.59 s | details |
#5 | ACCEPTED | 0.05 s | details |
#6 | ACCEPTED | 0.06 s | details |
#7 | ACCEPTED | 0.28 s | details |
#8 | ACCEPTED | 0.57 s | details |
#9 | ACCEPTED | 0.62 s | details |
#10 | ACCEPTED | 0.59 s | details |
#11 | ACCEPTED | 0.46 s | details |
#12 | ACCEPTED | 0.64 s | details |
#13 | ACCEPTED | 0.47 s | details |
#14 | ACCEPTED | 0.62 s | details |
#15 | ACCEPTED | 1.74 s | details |
#16 | ACCEPTED | 0.53 s | details |
#17 | ACCEPTED | 0.30 s | details |
#18 | ACCEPTED | 1.26 s | details |
#19 | ACCEPTED | 0.14 s | details |
#20 | ACCEPTED | 0.12 s | details |
#21 | ACCEPTED | 0.14 s | details |
#22 | ACCEPTED | 0.45 s | details |
#23 | ACCEPTED | 0.41 s | details |
#24 | ACCEPTED | 0.40 s | details |
#25 | ACCEPTED | 0.55 s | details |
#26 | ACCEPTED | 2.63 s | details |
Code
#include <set> #include <iostream> #include <unordered_set> #include <vector> #include <algorithm> const int N = 5 * (1e5); const int P = 19; long long jump[P][N]; long long last[N]; int nxt[N]; int main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); int n; std::cin >> n; for (int i = 0; i < n; ++i) { std::cin >> jump[0][i]; } for (int p = 1; p < P; ++p) { for (int i = 0; i < n; ++i) { int next = std::min(n-1, i + (1<<(p-1))); jump[p][i] = std::__gcd(jump[p-1][i], jump[p-1][next]); } } //std::vector<long long> res; std::unordered_set<long long> res; res.rehash(1e6); for (int s = 0; s < n; ++s) { long long val = jump[0][s]; if ((s < n-1) && (val == jump[0][s+1])) continue; int i = s; // loop the times it decreases while(i < n) { if (i != s) val = std::__gcd(val, jump[0][i]); if(last[i] == val) break; last[i] = val; // loop the binary search int j = P-1; while(j && (i + (1<<j) >= n)) { --j; } while(i < n) { // loop the jump for (; j >= 1; --j) { if (jump[j][i] % val == 0) break; } if (j == 0) { i = i + 1; break; } else { i += (1<<j) - 1; --j; } } //res.push_back(val); res.insert(val); if (val == 1) break; } } //std::sort(res.begin(), res.end()); //res.erase(std::unique(res.begin(), res.end()), res.end()); std::cout << res.size() << '\n'; }
Test details
Test 1
Verdict: ACCEPTED
input |
---|
500000 576460752303423488 28823037615... |
correct output |
---|
8627 |
user output |
---|
8627 |
Test 2
Verdict: ACCEPTED
input |
---|
500000 450283905890997363 15009463529... |
correct output |
---|
238576 |
user output |
---|
238576 |
Test 3
Verdict: ACCEPTED
input |
---|
500000 576460752303423488 28823037615... |
correct output |
---|
99106 |
user output |
---|
99106 |
Test 4
Verdict: ACCEPTED
input |
---|
500000 701982420492091392 23399414016... |
correct output |
---|
759 |
user output |
---|
759 |
Test 5
Verdict: ACCEPTED
input |
---|
5 999999937 999999866000004473 9... |
correct output |
---|
4 |
user output |
---|
4 |
Test 6
Verdict: ACCEPTED
input |
---|
4 100000000000000003 10000000000... |
correct output |
---|
3 |
user output |
---|
3 |
Test 7
Verdict: ACCEPTED
input |
---|
500000 2 114 30 210 2310 30030 30030 ... |
correct output |
---|
130 |
user output |
---|
130 |
Test 8
Verdict: ACCEPTED
input |
---|
400000 4 6 10 14 22 26 34 38 46 58 62... |
correct output |
---|
160 |
user output |
---|
160 |
Test 9
Verdict: ACCEPTED
input |
---|
500000 2 430677 5 2 3 5 2 3 5 2 3 5 2... |
correct output |
---|
1368 |
user output |
---|
1368 |
Test 10
Verdict: ACCEPTED
input |
---|
450000 2 8052 5 2 3 5 15778 3 5 2 3 5... |
correct output |
---|
822 |
user output |
---|
822 |
Test 11
Verdict: ACCEPTED
input |
---|
500000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
correct output |
---|
1582 |
user output |
---|
1582 |
Test 12
Verdict: ACCEPTED
input |
---|
500000 4 6 10 14 22 26 34 38 46 58 62... |
correct output |
---|
181 |
user output |
---|
181 |
Test 13
Verdict: ACCEPTED
input |
---|
300000 4 6 10 14 22 26 34 38 46 58 62... |
correct output |
---|
174 |
user output |
---|
174 |
Test 14
Verdict: ACCEPTED
input |
---|
500000 4 6 10 14 22 26 34 38 46 58 62... |
correct output |
---|
188 |
user output |
---|
188 |
Test 15
Verdict: ACCEPTED
input |
---|
500000 259695496911122585 42019614072... |
correct output |
---|
4 |
user output |
---|
4 |
Test 16
Verdict: ACCEPTED
input |
---|
500000 1 2 4 8 16 32 64 128 256 512 1... |
correct output |
---|
60 |
user output |
---|
60 |
Test 17
Verdict: ACCEPTED
input |
---|
100000 59299434989690526 421945966867... |
correct output |
---|
100444 |
user output |
---|
100444 |
Test 18
Verdict: ACCEPTED
input |
---|
500000 11245340592095052 677443682130... |
correct output |
---|
500999 |
user output |
---|
500999 |
Test 19
Verdict: ACCEPTED
input |
---|
100000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
correct output |
---|
287 |
user output |
---|
287 |
Test 20
Verdict: ACCEPTED
input |
---|
100000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
correct output |
---|
330 |
user output |
---|
330 |
Test 21
Verdict: ACCEPTED
input |
---|
100000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
correct output |
---|
287 |
user output |
---|
287 |
Test 22
Verdict: ACCEPTED
input |
---|
500000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
correct output |
---|
339 |
user output |
---|
339 |
Test 23
Verdict: ACCEPTED
input |
---|
500000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
correct output |
---|
372 |
user output |
---|
372 |
Test 24
Verdict: ACCEPTED
input |
---|
500000 524288 262144 131072 65536 327... |
correct output |
---|
60 |
user output |
---|
60 |
Test 25
Verdict: ACCEPTED
input |
---|
100000 307444891294245705 20496326086... |
correct output |
---|
211 |
user output |
---|
211 |
Test 26
Verdict: ACCEPTED
input |
---|
500000 307444891294245705 20496326086... |
correct output |
---|
211 |
user output |
---|
211 |