…
主要是他这个-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;
};
//我们可以提出最大公约数之后 用map<ar,int>cnt
// 那就是联通分量。。相乘不行吗
// https://www.cnblogs.com/myrcella/p/12913733.html