求助普及组月赛T3
  • 板块学术版
  • 楼主bsdsdb
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/7/22 17:57
  • 上次更新2023/11/3 08:13:33
查看原帖
求助普及组月赛T3
790188
bsdsdb楼主2023/7/22 17:57

思路是:

(a1,a2,…,an)×[a1,a2,…,an]=∏i=1nai⇔(a1(a1,a2,…,an),a2(a1,a2,…,an),…,an(a1,a2,…,an))=1\begin{aligned}&\left(a_1,a_2,\dots,a_n\right)\times\left[a_1,a_2,\dots,a_n\right]=\prod_{i=1}^na_i\\\Leftrightarrow&\left(\dfrac{a_1}{\left(a_1,a_2,\dots,a_n\right)},\dfrac{a_2}{\left(a_1,a_2,\dots,a_n\right)},\dots,\dfrac{a_n}{\left(a_1,a_2,\dots,a_n\right)}\right)=1\end{aligned}

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;

int T, n, a[500005], g;
map<int, bool> b;

void inti() {
	n = 0;
	memset(a, 0, sizeof(a));
	g = 0;
	for (auto& i : b) {
		i.second = 0;
	}
}

int ggcd(int x, int y) {
	if (x == 0 || y == 0) {
		return x + y;
	}
	return ggcd(max(x, y) % min(x, y), min(x, y));
}

bool prf(int x, int y, bool st) {
	if (x == 1) {
		return 0;
	} 
	if (x % y == 0) {
		if (b[y] && st) {
			return 1;
		}
		b[y] = 1;
		return prf(x / y, y, 0);
	} else {
		return prf(x, y + 1, 1);
	}
}

int main() {
	cin >> T;
	here:
	while (T--) {
		inti();
		cin >> n;
		for (int i = 1; i <= n; i++) {
			cin >> a[i];
		}
		g = a[1];
		for (int i = 2; i <= n; i++) {
			g = ggcd(g, a[i]);
		}
		for (int i = 1; i <= n; i++) {
			a[i] /= g;
		}
		for (int i = 1; i <= n; i++) {
			if (prf(a[i], 2, 1)) {
				cout << "No" << endl;
				goto here;
			}
		}
		cout << "Yes" << endl;
	}
	return 0;
}

WA12个点,是不是结论有误

2023/7/22 17:57
加载中...