题意:
给你一棵树,每条边有一个权值[0,9],让你找出所有点对(u,v)使得u到v路径组成的数能被m整除(像字符串一样组成)
题解:
很明显可以看出树分治,如果之前没有接触过树分治建议先做下poj1741(可以参考国家队论文写的很详细)
然后来说这题的思路,对这棵树进行点分治,每次分治算经过根节点的满足条件的点对数有几个,每次分治时在dfs时记录下每个节点的d1(从该节点到根组成的数),d2(从根到该节点组成的数),并且我们用map来存d1的个数,用pair来存d2和deep(该节点到根的距离即深度,这样我们可以通过d1*(10^deep)+d2来表示一个数,然后对每一个pair计算map中有多少个d1使得d1*(10^deep)+d2%m==0,也即map<-d2/(10^deep)>,这里要用到逆元,最好用exgcd求,如果有费马小定理求得话记得特判1(不然会TLE),处理数字的时候要对从根出发的数字特殊处理下,具体细节见代码
#include