• 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个象的奇偶性是不同的,如果相同则

  • 相关阅读:
    基于antlr的表达式解析器
    ANTLR语法层的选项及动作
    Understanding ANTLR Grammar Files
    写给Git初学者的7个建议
    Top 8 Diagrams for Understanding Java
    技术面不深入
    一个初级程序员学习新技术的策略
    SoftReference,WeakReference&WeakHashMap
    探索Antlr(Antlr 3.0更新版)
    Five minute introduction to ANTLR 3
  • 原文地址:https://www.cnblogs.com/Flash-plus/p/13834146.html
Copyright © 2020-2023  润新知