相当于求边权和为3的倍数的路径条数
1 #include2 using namespace std; 3 const int N=20010,oo=INT_MAX; 4 int n,ans; 5 int tot,root,f[N],siz[N],dep_cnt[5]; 6 bool vis[N]; 7 int gcd(int a,int b){ return b?gcd(b,a%b):a;} 8 struct Edge{ 9 int to,len;10 Edge(int _to=0,int _len=0):to(_to),len(_len){}11 }edge[N<<1];12 int edge_tot;13 vector point[N];14 void add_edge(int f,int t,int l){15 edge[edge_tot]=Edge(t,l);16 point[f].push_back(edge_tot++);17 return;18 }19 void getroot(int k,int fa){20 f[k]=0,siz[k]=1;21 for(int i=0;i f[k]) root=k;30 return;31 }32 void dfs(int k,int fa,int d){33 dep_cnt[d]++;34 for(int i=0;i