Rating changes for last rounds are temporarily rolled back. They will be returned soon. ×

 
 
 
 
General
 
 
# Author Problem Lang Verdict Time Memory Sent Judged  
41846474 Contestant:
mango_lassi
1025D - 43 C++17 (GCC 7-32) Accepted 140 ms 1460 KB 2018-08-19 17:19:58 2018-08-19 19:29:51
→ Source
#include <iostream>
using namespace std;

const int N = 700;
bool dp[N][N][2];
bool edge[N][N];
int vals[N];

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

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i) cin >> vals[i];
	for (int a = 0; a < n; ++a) {
		for (int b = 0; b < n; ++b) {
			if (gcd(vals[a], vals[b]) > 1) {
				edge[a][b] = true;
				// cout << "edge[" << a << "][" << b << "] = true\n";
			}
		}
	}
	for (int i = 0; i < n; ++i) {
		dp[i][i][0] = true;
		dp[i][i][1] = true;
	}
	for (int len = 1; len < n; ++len) {
		for (int a = 0; a + len < n; ++a) {
			int b = a + len;
			for (int i = a; i < b; ++i) {
				if (dp[a][i][1] && dp[i][b-1][0] && edge[i][b]) {
					dp[a][b][1] = true;
					break;
				}
			}
			for (int i = a+1; i <= b; ++i) {
				if (dp[a+1][i][1] && dp[i][b][0] && edge[i][a]) {
					dp[a][b][0] = true;
					break;
				}
			}
		}
	}
	
	bool can = false;
	for (int i = 0; i < n; ++i) {
		if (dp[0][i][1] && dp[i][n-1][0]) can = true;
	}
	if (can) {
		cout << "Yes\n";
	} else {
		cout << "No\n";
	}
}
?
Time: ? ms, memory: ? KB
Verdict: ?
Input
?
Participant's output
?
Jury's answer
?
Checker comment
?
Diagnostics
?
Click to see test details