题目描述
给你一棵 n 个点带点权的树,第 i 个点的点权为 vi。
定义有向路径 s→e 的权值的计算方法为:
- 设从 s 到 e 的路径经过的点的点权分别为 z0,1,⋯,l,则该条路径的权值为 (z0k0+z1k1+⋯+zlkl)mody,记为 t(s→e)。
另给定常数 r,定义函数 f(x)=[x=r]。现在让你求满足以下条件的三元组 (p1,p2,p3) 的个数:(三个点可以相同)
- f(t(p1→p2))=f(t(p1→p3))=f(t(p2→p2))
输入格式
第一行四个整数 n,y,k,r。
接下来一行 个数代表每个点的点权。
接下来 n−1 行每行两个数代表树上一条边。
输出格式
输出一行代表答案。
样例 #1
样例输入 #1
3 5 2 1
4 3 1
1 2
2 3
样例输出 #1
14
样例 #2
见下发样例
提示
对于 10% 的数据,n≤10 。
对于 25% 的数据,n≤100 。
对于 40% 的数据,n≤10000 。
对于另外 15% 的数据,树退化为一条链。
对于另外 15% 的数据,k=1 。
对于 100% 的数据,1≤n≤105,2≤y≤109,1≤k<y,0≤r,vi<y ,保证 y 是质数。