luogu P5676 [GZOI2017] 小z玩游戏 0分求调
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct node{
int to,nxt;
}g[400005];
int n,head[100005],tot=1,st[100005],top,dfn[100005],low[100005],id,inst[100005],cnt,tong[100005],c[100005],T;
vector<int> kuai[100005];
int a[100005],b[100005];
void clearr(){
tot=1;
n=top=id=cnt=0;
memset(g,0,sizeof(g));
memset(head,0,sizeof(head));
memset(st,0,sizeof(st));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(tong,0,sizeof(tong));
memset(inst,0,sizeof(inst));
memset(kuai,0,sizeof(kuai));
memset(c,0,sizeof(c));
}
void add(int u,int v){
g[tot].to=v;
g[tot].nxt=head[u];
head[u]=tot++;
}
void tarjan(int u){
dfn[u]=low[u]=++id;
st[++top]=u;inst[u]=1;
for(int i=head[u];i;i=g[i].nxt){
int v=g[i].to;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(inst[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]){
int t=0;
cnt++;
while(t!=u){
t=st[top--];
inst[t]=0;
c[t]=cnt;
kuai[cnt].push_back(t);
}
}
}
int main(){
scanf("%d",&T);
while(T--){
clearr();
for(int i=1;i*2<N;i++){
for(int j=2;j*i<N;j++){
add(i,j*i);
}
}
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",a+i);
for(int i=1;i<=n;i++){
scanf("%d",b+i);
add(a[i],b[i]);
}
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
int ans=0;
for(int i=1;i<=n;i++) if(c[a[i]]==c[b[i]]) ans++;
printf("%d\n",ans);
}
return 0;
}