<span>题解 CF1225D</span>

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\)串的个数就行了。

全部评论

相关推荐

多多啊&nbsp;多多啊&nbsp;上来四道算法题算法题直播排序,整体比较简单把对象写出来,然后比较规则写明白就OK了。唯一一道A100%的电车充电如何最省钱,到目的地如何充电的钱最少,路上有充电站,每个电站价格不一样。用了DP来做,但感觉是贪心的样子,最后没招了,把不能到的情况给干了出来,过了8%日志分析纠错,滑动窗口,但我最后结果永远少一,过了15%没看,力竭了燃尽了多多&nbsp;以后牛客不用后台找我了,笔试夯爆了
淮竹c:不好意思,打扰大家🙏我是一个拼多多骑手,小电驴的最大电量为C,我的最大电量有1e9这么promax😭😭😭需要从x=0处走到x=L,L足足有1e9那么长处,途中有n个充电站,🙏🙏每个充电站的距离和电价分别为di和pi,初始电量是满的😭😭😭请告诉我到达终点最少要花多少钱😭😭😭求求大家把这些钱转给我
查看2道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务