CSES - BAPC 2017 - Results
Submission details
Task:Collatz Conjecture
Sender:Antti Röyskö
Submission time:2017-10-24 21:09:03 +0300
Language:C++
Status:READY
Result:
Test results
testverdicttime
#1--details
#2ACCEPTED1.41 sdetails
#3ACCEPTED2.10 sdetails
#4ACCEPTED1.06 sdetails
#5ACCEPTED0.05 sdetails
#6ACCEPTED0.06 sdetails
#7ACCEPTED0.95 sdetails
#8ACCEPTED0.94 sdetails
#9--details
#10--details
#11--details
#12ACCEPTED2.14 sdetails
#13ACCEPTED1.12 sdetails
#14ACCEPTED2.43 sdetails
#15ACCEPTED1.47 sdetails
#16ACCEPTED0.50 sdetails
#17ACCEPTED0.23 sdetails
#18ACCEPTED1.12 sdetails
#19ACCEPTED0.90 sdetails
#20ACCEPTED1.06 sdetails
#21ACCEPTED1.02 sdetails
#22--details
#23--details
#24--details
#25ACCEPTED0.80 sdetails
#26--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:

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:

input
500000
2 430677 5 2 3 5 2 3 5 2 3 5 2...

correct output
1368

user output
(empty)

Test 10

Verdict:

input
450000
2 8052 5 2 3 5 15778 3 5 2 3 5...

correct output
822

user output
(empty)

Test 11

Verdict:

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:

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:

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:

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:

input
500000
307444891294245705 20496326086...

correct output
211

user output
(empty)