CSES - HIIT Open 2018 - Results
Submission details
Task:Alien Invasion
Sender:Oispa nutellaa
Submission time:2018-05-26 11:47:01 +0300
Language:C++
Status:READY
Result:
Test results
testverdicttime
#1ACCEPTED0.01 sdetails
#2ACCEPTED0.01 sdetails
#3ACCEPTED0.01 sdetails
#4ACCEPTED0.01 sdetails
#5ACCEPTED0.01 sdetails
#6ACCEPTED0.01 sdetails
#7ACCEPTED0.01 sdetails
#8ACCEPTED0.01 sdetails
#9ACCEPTED0.01 sdetails
#10ACCEPTED0.01 sdetails
#11ACCEPTED0.01 sdetails
#12ACCEPTED0.01 sdetails
#13ACCEPTED0.01 sdetails
#14ACCEPTED0.01 sdetails
#15ACCEPTED0.01 sdetails
#16ACCEPTED0.01 sdetails
#17ACCEPTED0.01 sdetails
#180.01 sdetails
#19ACCEPTED0.01 sdetails
#20--details
#21ACCEPTED0.01 sdetails
#220.01 sdetails

Code

#include <iostream>
#include <vector>
#include <map>

using namespace std;
typedef long long ll;
typedef __int128 lll;

ll n;

ll mrb[12] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37};

lll modpow(lll k, lll e, lll m) {
	if (e == 0) return 1;
	if (e == 1) return k;
	
	if (e%2 == 0) {
		lll h = modpow(k, e/2, m)%m;
		return (h*h)%m;
	}
	return (k*modpow(k, e-1, m))%m;
}

bool witness(ll a, ll x, ll u, ll t) {
	lll cx = modpow(a, u, x);
	for (int i = 1; i <= t; ++i) {
		lll nx = (cx*cx)%x;
		if (nx == 1 && cx != 1 && cx != (x-1)) {
			return true;
		}
		cx = nx;
	}
	return (cx != 1);
}

bool miller_rabin(ll x) {
	if (x == 2) return true;
	if (x < 2 || x%2 == 0) return false;
	
	ll u = x-1;
	ll t = 0;
	while (u%2 == 0) {
		u /= 2;
		t++;
	}
	
	for (int i = 0; i < 12; ++i) {
		if (mrb[i] >= x-1) break;
		if (witness(mrb[i], x, u, t)) return false;
	}
	return true;
}

ll f(lll x, lll m) {
	return (x*x+1)%m;
}

ll gcd(ll a, ll b) {
	if (b == 0) return a;
	return gcd(b, a%b);
}

ll pollardrho(ll a, ll st) {
	if (n%2 == 0) return 2;
	ll x = st, y = st, d = 1;
	while (d == 1) {
		x = f(x, a);
		y = f(f(x, a), a);
		d = gcd(abs(x-y), a);
		if (d == a) return -1;
	}
	return d;
}

ll pdrive(ll x) {
	ll fa = -1;
	ll st = 2;
	while (fa == -1) {
		fa = pollardrho(x, st++);
	}
	return fa;
}

map<ll, ll> fact(ll x) {
	map<ll, ll> cres;
	while (!miller_rabin(x)) {
		ll cf = pdrive(x);
		ll mi = min(cf, x/cf);
		ll mx = max(cf, x/cf);
		cres[mi]++;
		x = mx;
	}
	cres[x]++;
	return cres;
}

int main() {
	cin >> n;
	if (n == 1) {
		cout << "odd\n";
		return 0;
	}
	map<ll, ll> mp = fact(n);
	ll res = 1;
	for (auto a : mp) {
		res *= (a.second+1);
		res %= 2;
	}
	if (res%2 == 0) cout << "even\n";
	else cout << "odd\n";
	return 0;
}

Test details

Test 1

Verdict: ACCEPTED

input
1

correct output
odd

user output
odd

Test 2

Verdict: ACCEPTED

input
2

correct output
even

user output
even

Test 3

Verdict: ACCEPTED

input
3

correct output
even

user output
even

Test 4

Verdict: ACCEPTED

input
4

correct output
odd

user output
odd

Test 5

Verdict: ACCEPTED

input
5

correct output
even

user output
even

Test 6

Verdict: ACCEPTED

input
6

correct output
even

user output
even

Test 7

Verdict: ACCEPTED

input
7

correct output
even

user output
even

Test 8

Verdict: ACCEPTED

input
8

correct output
even

user output
even

Test 9

Verdict: ACCEPTED

input
9

correct output
odd

user output
odd

Test 10

Verdict: ACCEPTED

input
10

correct output
even

user output
even

Test 11

Verdict: ACCEPTED

input
11

correct output
even

user output
even

Test 12

Verdict: ACCEPTED

input
12

correct output
even

user output
even

Test 13

Verdict: ACCEPTED

input
13

correct output
even

user output
even

Test 14

Verdict: ACCEPTED

input
14

correct output
even

user output
even

Test 15

Verdict: ACCEPTED

input
15

correct output
even

user output
even

Test 16

Verdict: ACCEPTED

input
16

correct output
odd

user output
odd

Test 17

Verdict: ACCEPTED

input
17

correct output
even

user output
even

Test 18

Verdict:

input
18

correct output
even

user output
odd

Test 19

Verdict: ACCEPTED

input
19

correct output
even

user output
even

Test 20

Verdict:

input
999999874000003969

correct output
odd

user output
(empty)

Test 21

Verdict: ACCEPTED

input
999999999999999989

correct output
even

user output
even

Test 22

Verdict:

input
1000000000000000000

correct output
odd

user output
even