hash好题

CF1225D:

题意:

(a_i * a_j = x^k) 求有多少组不同的((i,j))

很妙的一道hash题/雾

对于原来的柿子:
(a_i * a_j = x^k)

我们可以转化成一种什么问题呢?

看到后面的 (x^k)你就会想到分解原式,利用唯一分解定理可以得出:

[a_i = prod_{i = 1}^{n}{p_i}^{A_i} ]

[b_i = prod_{i = 1}^{n}{p_i}^{B_i} ]

[x = prod_{i = 1}^{n}{p_i}^{C_i} ]

再看回原来的柿子,可以得到:

[prod_{i = 1}^{n}{p_i}^{A_i} * prod_{i = 1}^{n}{p_i}^{B_i} = prod_{i = 1}^{n}{p_i}^{C_i^{k}} ]

化简:

[prod_{i = 1}^{n}{p_i}^{A_i + B_i} = prod_{i = 1}^{n}{p_i}^{C_i^{k}} ]

因为对于所有 (p_i)都是质数,且对于所有 (C_i)都是未定的值,所以只要满足:
(A_i + B_i = k * t)((A_i + B_i) \% k = 0)

那么这个问题解决了,接下来就是要匹配了,肯定不可以 (n^2)暴力

那么就是hash出场了,众所周知 (hash) 是个很玄学的东西,你把每个 (a_i)分解出来的 (A_i) 看出一个字符串,并对它((A_i))和它的互补(hash)((B_i))进行 (hash)运算记录下来,并且用神器(map)记录每个(hash)出现的个数,然后最后只要(O(n))统计一下它的互补(hash)串的个数就行了。

CF463C:

题意:

在一个n∗n的国际象棋的棋盘上放两个象,要求不能有位置同时被两个象攻击到,然后被一个象攻击到的位置上获得得分。(象放的位置也获得该位置得分),求得分的最大值。

这个题目,相信大家只要玩过国际象棋的就应该都知道,他的2个象的奇偶性是不同的,如果相同则

原文地址:https://www.cnblogs.com/Flash-plus/p/13834146.html