CSES - BAPC 2017 - Results
Submission details
Task:Collatz Conjecture
Sender:Antti Röyskö
Submission time:2017-10-24 21:19:50 +0300
Language:C++
Status:READY
Result:
Test results
testverdicttime
#1ACCEPTED0.46 sdetails
#2ACCEPTED0.93 sdetails
#3ACCEPTED0.63 sdetails
#4ACCEPTED0.61 sdetails
#5ACCEPTED0.06 sdetails
#6ACCEPTED0.06 sdetails
#7ACCEPTED0.27 sdetails
#8ACCEPTED0.42 sdetails
#9ACCEPTED0.45 sdetails
#10ACCEPTED0.47 sdetails
#11ACCEPTED0.57 sdetails
#12ACCEPTED0.49 sdetails
#13ACCEPTED0.39 sdetails
#14ACCEPTED0.50 sdetails
#15ACCEPTED1.86 sdetails
#16ACCEPTED0.49 sdetails
#17ACCEPTED0.29 sdetails
#18ACCEPTED1.20 sdetails
#19ACCEPTED0.16 sdetails
#20ACCEPTED0.14 sdetails
#21ACCEPTED0.14 sdetails
#22ACCEPTED0.41 sdetails
#23ACCEPTED0.52 sdetails
#24ACCEPTED0.48 sdetails
#25ACCEPTED0.95 sdetails
#26--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 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) {
				if(last[i] == val) goto pois;
				last[i] = val;
				// 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);

		}
		pois:;

	}
	//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:

input
500000
307444891294245705 20496326086...

correct output
211

user output
(empty)