题意:给出n个点的树,每个结点有权值,求一条路径,使得路径上点的乘积对1e6+3取模的结果为K。
思路:树上的基于点的分治,如何计算乘积为K的路径呢?对于每个分支的点,计算从根节点到当前点的乘积x,然后利用逆元可以算出y=K*x^(-1),然后通过hash去查找y的值是否出现过即可,逆元可以用扩展欧几里得预处理出来,对于相应的值要标记最小能得到它的点,边搞边去更新ans就行了。
注意:为了防止超时,无需每次将保存y是否出现过的数组清零,记录flag[y]=tot,tot为当前递归层数,只有在同一层上即tot相同才判断为出现过。
#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<stdio.h>
#include<math.h>
#include <string>
#include<string.h>
#include<map>
#i