• 题解 CF1225D


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

  • 相关阅读:
    二级指针与二维数组
    Linux下常用命令
    winows下使用ssh服务远程登录vbox中的虚拟机
    Shell脚本获取C语言可执行程序返回值
    memcpy与memmove的区别
    常用软件
    书目
    顺序表C语言版
    限定符【const】用法大全
    极大极小搜索和α-β剪枝
  • 原文地址:https://www.cnblogs.com/Flash-plus/p/13834300.html
Copyright © 2020-2023  润新知