CSES - BAPC 2017 - Results
Submission details
Task:Collatz Conjecture
Sender:Antti Röyskö
Submission time:2017-10-24 21:44:47 +0300
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.47 sdetails
#2ACCEPTED0.85 sdetails
#3ACCEPTED0.69 sdetails
#4ACCEPTED0.59 sdetails
#5ACCEPTED0.05 sdetails
#6ACCEPTED0.06 sdetails
#7ACCEPTED0.28 sdetails
#8ACCEPTED0.57 sdetails
#9ACCEPTED0.62 sdetails
#10ACCEPTED0.59 sdetails
#11ACCEPTED0.46 sdetails
#12ACCEPTED0.64 sdetails
#13ACCEPTED0.47 sdetails
#14ACCEPTED0.62 sdetails
#15ACCEPTED1.74 sdetails
#16ACCEPTED0.53 sdetails
#17ACCEPTED0.30 sdetails
#18ACCEPTED1.26 sdetails
#19ACCEPTED0.14 sdetails
#20ACCEPTED0.12 sdetails
#21ACCEPTED0.14 sdetails
#22ACCEPTED0.45 sdetails
#23ACCEPTED0.41 sdetails
#24ACCEPTED0.40 sdetails
#25ACCEPTED0.55 sdetails
#26ACCEPTED2.63 sdetails

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