题解 CF1322C 【Instant Noodles】
对于右部点
对于
对于
合并后,所有点的
判断
const int N = 5e5 + 7;
int n, m, B, P;
ll a[N];
vi e[N];
inline int h(vi p) {
sort(p.begin(), p.end());
int ret = 0;
for (int x : p) ret = (1ll * ret * B + x) % P;
return ret;
}
inline void solve() {
rd(n), rd(m), rda(a, n);
for (int i = 1; i <= n; i++) e[i].clear();
for (int i = 1, x, y; i <= m; i++) rd(x), rd(y), e[y].pb(x);
map<int, ll> p;
for (int i = 1; i <= n; i++)
if (e[i].size()) p[h(e[i])] += a[i];
ll d = 0;
for (auto o : p) d = d ? __gcd(d, o.se) : o.se;
print(d);
}
int main() {
srand(time(0));
P = rdm((int)1e8, (int)1e9);
B = rdm((int)1e7, (int)1e8);
int T;
rd(T);
while (T--) solve();
return 0;
}