problem
给一颗树,边有边权。求经过的边权积为完全平方数的路径条数。
$n<1e5,a_i<1e8$
solution
emm
可以看出要用点分治。
可是桶不好开。
所以要考虑转换。
我们可以将任意一个数X这样表示。
$X = p_1^{a_1}* p_2^{a_2} * p_3^{a_3}$ ……
$p$ 为质数。
然后我们给所有$p_i$ 赋一个随机值$h(p_i)$。
定义 $F(X)$ 为所有 $a_i为奇数的h(p_i)的异或和$
所以,我们可以得到。
当且仅当 $F(x) = 0$ 时,$x$ 为完全平方数。
所以我们可以把 $A,B$ 两数的积用 $F(A)\oplus F(B)$ 表示,因为我们仅需要知道一个数是否为完全平方数。
然后这题就完了。
好吧,还有一些细节。
比如 $h(p_i)$ 的随机值要是 $long~long$ 范围的。这样才能保证正确性。
还有,因为 $a_i<1e8$ 不能用线性筛,所以我们要筛出 $1e4$ 以内的质数,然后对所有数用 $\frac {\sqrt a_i}{\ln n}$ 的复杂度算出 $F(a_i)$ 。
还有一点很重要,桶不能用 $map$ ,只能用 $hash$ 。
先上一份自己打的,但是被 $hack$ 数据卡T了的代码:
1 |
|
这份代码,卡了半年常,就是卡不过。
后来把手写哈希换成hash_table就过了。
感谢fatesky大佬的帮助!!!
1 |
|