E - ∙ (Bullet) 不能同池子的限制,计数


主要是他这个-1 。。。因为 x y是并 。。比如 x 有0123 y也有012 就两种0 。。有-1 。
然后同号 异号 ? 同号 异号 就是分两类。。
的处理。。和计算。

void solve() {
	cin >> n;
	map<ar, ar>mp;
	int cnt = 0;
	for (int i = 1; i <= n; ++i) {
		int x, y; cin >> x >> y;
		if (x == 0 && y == 0)
			cnt++;
		else if (x == 0)mp[ {0, 0}][0]++;
		else if (y == 0)mp[ {0, 0}][1]++;
		else {
			int t = gcd(x, y);
			x /= t, y /= t;
			if (x < 0 && y < 0)mp[ { -x, -y}][0]++;
			else if (x < 0)mp[ {y, -x}][1]++;
			else if (y < 0)mp[ { -y, x}][1]++;
			else mp[ {x, y}][0]++;
		}
	}
	Z ans = 1;
	for (auto[_, t] : mp) {
		auto[x, y] = t;
		ans *= qpow(2, x) + qpow(2, y) - 1;
	}
	ans += Z(cnt - 1);

	cout << ans;
};


//我们可以提出最大公约数之后 用mapcnt
// 那就是联通分量。。相乘不行吗
// https://www.cnblogs.com/myrcella/p/12913733.html

你可能感兴趣的:(算法)