HDU 4812 D Tree 樹分治+逆元+hash新姿勢
題意:
給定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