题意:
给定n个点的树 K
下面n个数是点权
下面n-1行给出树边。
问:
是否存在一条路径使得路径上点权积 % mod = K
若存在则输出路径的两端。
若存在多条路径则输出字典序最小的一条。
思路:
按树重心分治。
分成路径是否经过树重心。
然后用力码。。
has[x] = u;
表示乘积为x 对应的点是u
但这样has就不能用计数器来优化清空。
所以用2个数组: has[x] = cnt; has_id[x] = u;
这样has里存的是乘积为x是否存在。has_id[x] 来记录点。
#pragma comment(linker, "/STACK:10240000000000,10240000000000")
#include
#include
#include
#include
#include