https://codeforces.com/problemset/problem/1322/C
Blog de referencia: https://blog.csdn.net/jk_chen_acmer/article/details/107296232
MCD (a + b + c, b + c + d, a + b + c + d)
Después de ser eliminado y restado, obtenemos: MCD (a, b + c, d)
El análisis puede llevar a una conclusión: para el punto de la derecha, si dos puntos (aquí byc) están conectados al mismo conjunto de puntos (AB), entonces estos dos puntos son del mismo tipo.
El resultado es el mcd de la suma de los pesos internos de todos los puntos.
Y analiza qué puntos son de un tipo y usa hash.
Iluminación: encontré el gcd relacionado e intenté utilizar el método de lanzar y restar.
Por supuesto, cf debe tener un módulo dual. Y cuando la cantidad de entrada de datos es grande, se requiere scanf. Esta vez cf ha bloqueado el cin (apagué el flujo síncrono
Luego, escribir directamente el mapa hash que establece un vector <>, es decir, map<vector<int>, int>
el vector se asigna a un número entero.
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=5e5+100;
typedef long long LL;
typedef pair<LL,LL> p;
LL c[maxn],g[maxn];
const int P=131;
const int mod1=19260817;
const int mod2=19660813;
vector<int>v[maxn];
int main(void)
{
//cin.tie(0);std::ios::sync_with_stdio(false);
int t;scanf("%d",&t);
while(t--)
{
// pair<LL,LL>p;
map<p,LL>map1;
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&c[i]),v[i].clear(),g[i]=0;
for(int i=1;i<=m;i++){
LL x,y;scanf("%d%d",&x,&y);v[y].push_back(x);
}
for(int i=1;i<=n;i++){
if(!v[i].size()) continue;
sort(v[i].begin(),v[i].end());
}
for(int i=1;i<=n;i++){
int hx1=0;int hx2=0;
if(v[i].size()==0) continue;
for(int j=0;j<v[i].size();j++)
{
hx1=(hx1*P%mod1+v[i][j]%mod1)%mod1;
hx2=(hx2*P%mod2+v[i][j]%mod2)%mod2;
}
p k={hx1,hx2};
if(!map1[k]) map1[k]=i;
g[map1[k]]+=c[i];
}
LL gcd=0;
for(int i=1;i<=n;i++) gcd=__gcd(gcd,g[i]);
printf("%lld\n",gcd);
}
return 0;
}