就只挖了#23
代码:
#include<bits/stdc++.h>
#define ri register int
#define int long long
using namespace std;
const int maxn=261326,maxm=613262,inf=2147483647;
int n,m;
int cnt,head[maxn],to[maxm],nxt[maxm],bq2[maxm],bq5[maxm];
void add(int u,int v,int w2,int w5){
++cnt;
to[cnt]=v;
nxt[cnt]=head[u];
head[u]=cnt;
bq2[cnt]=w2;bq5[cnt]=w5;
}
int a2[maxn],a5[maxn],b2[maxn],b5[maxn];
int siz[maxn],son[maxn],f[maxn],dep[maxn];
int val[maxn];
void dfs1(int u,int fa){
f[u]=fa;
dep[u]=dep[fa]+1;
siz[u]=1;
int maxi=0;
for(ri e=head[u];e;e=nxt[e]){
int v=to[e];
if(v==fa)continue;
b2[v]=b2[u]+bq2[e];
b5[v]=b5[u]+bq5[e];
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>maxi){
maxi=siz[v];
son[u]=v;
}
}
}
int top[maxn];
void dfs2(int u,int topf){
top[u]=topf;
if(son[u])dfs2(son[u],topf);
for(ri e=head[u];e;e=nxt[e]){
int v=to[e];
if(v^f[u]&&v^son[u])dfs2(v,v);
}
}
int gcd(int a,int b){
return(b?gcd(b,a%b):a);
}
int lca(int a,int b){
while(top[a]^top[b]){
if(dep[top[a]]<dep[top[b]])swap(a,b);
a=f[top[a]];
}if(dep[a]>dep[b])swap(a,b);
return a;
}
signed main(){
//freopen("lg.in","r",stdin);
//freopen("lg.out","w",stdout);
ios::sync_with_stdio(0);
cin>>n>>m;
for(ri i=1;i<=n;i++){
int g;cin>>g;
if(g==0){
a2[i]=-1;
continue;
}
int c2=0,c5=0;
while(!(g%2)){
g/=2;
c2++;
}
while(!(g%5)){
g/=5;
c5++;
}a2[i]=c2;
a5[i]=c5;
//cout<<i<<' '<<c2<<' '<<c5<<endl;
}
for(ri i=1,u,v;i<n;i++){
double w;
cin>>u>>v>>w;
if(w==0){
add(u,v,-inf,-inf);
add(v,u,-inf,-inf);
continue;
}
int g=gcd(1e4,w*1e4);
g=1e4/g;
int c2=0,c5=0;
while(!(g%2)){
g/=2;
c2++;
}
while(!(g%5)){
g/=5;
c5++;
}
//cout<<u<<' '<<v<<' '<<c2<<' '<<c5<<endl;
add(u,v,c2,c5);
add(v,u,c2,c5);
}
dfs1(1,0);
dfs2(1,1);
while(m--){
int a,b;
cin>>a>>b;
int l=lca(a,b);
int c2=b2[a]+b2[b]-2*b2[l];
int c5=b5[a]+b5[b]-2*b5[l];
if(a2[a]>=c2&&a5[a]>=c5||a2[a]==-1)cout<<"Yes\n";
else cout<<"No\n";
}
//fclose(stdin);
//fclose(stdout);
return 0;
}