Task: | Collatz Conjecture |
Sender: | Antti Röyskö |
Submission time: | 2017-10-24 21:09:03 +0300 |
Language: | C++ |
Status: | READY |
Result: | TIME LIMIT EXCEEDED |
test | verdict | time | |
---|---|---|---|
#1 | TIME LIMIT EXCEEDED | -- | details |
#2 | ACCEPTED | 1.41 s | details |
#3 | ACCEPTED | 2.10 s | details |
#4 | ACCEPTED | 1.06 s | details |
#5 | ACCEPTED | 0.05 s | details |
#6 | ACCEPTED | 0.06 s | details |
#7 | ACCEPTED | 0.95 s | details |
#8 | ACCEPTED | 0.94 s | details |
#9 | TIME LIMIT EXCEEDED | -- | details |
#10 | TIME LIMIT EXCEEDED | -- | details |
#11 | TIME LIMIT EXCEEDED | -- | details |
#12 | ACCEPTED | 2.14 s | details |
#13 | ACCEPTED | 1.12 s | details |
#14 | ACCEPTED | 2.43 s | details |
#15 | ACCEPTED | 1.47 s | details |
#16 | ACCEPTED | 0.50 s | details |
#17 | ACCEPTED | 0.23 s | details |
#18 | ACCEPTED | 1.12 s | details |
#19 | ACCEPTED | 0.90 s | details |
#20 | ACCEPTED | 1.06 s | details |
#21 | ACCEPTED | 1.02 s | details |
#22 | TIME LIMIT EXCEEDED | -- | details |
#23 | TIME LIMIT EXCEEDED | -- | details |
#24 | TIME LIMIT EXCEEDED | -- | details |
#25 | ACCEPTED | 0.80 s | details |
#26 | TIME LIMIT EXCEEDED | -- | details |
Code
#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 gcd(long long a, long long b) { return std::__gcd(a, b); if (a < b) return gcd(b, a); if (b == 0) return a; return gcd(b, a % b); } */ /* long long gcd(long long a, long long b) { int twos = 0; while(((a | b) & 1) == 0) { a >>= 1; b >>= 1; ++twos; } while(a != b) { if (a < b) std::swap(a, b); if (a & b & 1) { a = (a-b)>>1; } else if (a & 1) { b >>= 1; } else { a >>= 1; } } return a << twos; } */ 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]; int i = s; // loop the times it decreases while(i < n) { if (i != s) val = std::__gcd(val, jump[0][i]); // 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) { long long sub = std::__gcd(val, jump[j][i]); if (sub == val) { break; } } if (j == 0) { i = i + 1; break; } else { i += (1<<j) - 1; --j; } } //res.push_back(val); res.insert(val); } } //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: TIME LIMIT EXCEEDED
input |
---|
500000 576460752303423488 28823037615... |
correct output |
---|
8627 |
user output |
---|
(empty) |
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: TIME LIMIT EXCEEDED
input |
---|
500000 2 430677 5 2 3 5 2 3 5 2 3 5 2... |
correct output |
---|
1368 |
user output |
---|
(empty) |
Test 10
Verdict: TIME LIMIT EXCEEDED
input |
---|
450000 2 8052 5 2 3 5 15778 3 5 2 3 5... |
correct output |
---|
822 |
user output |
---|
(empty) |
Test 11
Verdict: TIME LIMIT EXCEEDED
input |
---|
500000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
correct output |
---|
1582 |
user output |
---|
(empty) |
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: TIME LIMIT EXCEEDED
input |
---|
500000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
correct output |
---|
339 |
user output |
---|
(empty) |
Test 23
Verdict: TIME LIMIT EXCEEDED
input |
---|
500000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... |
correct output |
---|
372 |
user output |
---|
(empty) |
Test 24
Verdict: TIME LIMIT EXCEEDED
input |
---|
500000 524288 262144 131072 65536 327... |
correct output |
---|
60 |
user output |
---|
(empty) |
Test 25
Verdict: ACCEPTED
input |
---|
100000 307444891294245705 20496326086... |
correct output |
---|
211 |
user output |
---|
211 |
Test 26
Verdict: TIME LIMIT EXCEEDED
input |
---|
500000 307444891294245705 20496326086... |
correct output |
---|
211 |
user output |
---|
(empty) |