zoukankan      html  css  js  c++  java
  • ACM/ICPC Moscow Prefinal 2019 趣题记录

    ### Day1:

    ### **Problem C:**

    设$k_i​$为$[A, B]​$中二进制第$i​$位是1的数的个数。 给出$k_0 cdots k_{63}​$, 求出$[A, B]​$.

    **Solution:**

    从高位开始考虑。找到最大的$m, k_m eq 0$, 那么只有2种情况:

    - $A lt 2^m leq B$: 显然只可能$B = 2^m+k_m-1, A = B-2k_0 or A = B-2k_0-1$ . check一下就好了。
    - $A, B ge 2^m$ : 转化为$[A-2^m, B-2^m]$, 注意还有一个额外限制$B-A+1=k_m$.

    ### **Problem** E:

    给出整系数多项式$F(x)​$, 项数 <= 1000, 求最小的正整数$x_0, F(x_0) = F'(x_0) = 0​$.

    **Solution:**

    设$minF$是$F(x)$次数最小的项的系数,则有$x_0^2 | minF$

    证明:

    $F(x_0) = 0 ightarrow F(x) = (x-x_0)*G(x) ightarrow minF = -x_0minG ightarrow x_0 | minF​$

    $F'(x_0) = 0 ightarrow F(x) = (x-x_0)^2*G(x) ightarrow minF = x_0^2minG ightarrow x_0^2 | minF​$

    只要想办法找到F(x)的所有平方因子然后取几个随机模数check一下即可。

    题目保证$F(x)$系数 $<= 10^{15}$, 可以筛掉$minF leq10^5$的质因子,然后只要考虑剩下的数是完全平方数的情况,就可以枚举出所有平方因子了。

    ### **Problem I:**

    给出R个字符串,填入R*C的格子里,第i个字符串要填到第i行,如下图:

    I_C_P_C_
    ICPC____
    _IC___PC

    两个格子相邻当且仅当共边,相邻格子填入的字母一样得1分,要使得分最大。 R<=128, C<=8.

    **Solution:**

    - 轮廓线DP,记录轮廓线上每个位置是否填了字母,就可以算出当前dp的格子应该填的是当前字符串的第几个字符。

    ## Day3:

    ### **Problem D:**

    两个人打牌,任意两张不同种类的牌有克制关系,每次两人同时出1张牌,如果相同都死,不同的话根据克制关系厉害的牌收回,弱的牌死掉。最终如果两个人都没牌,各得0.5分,否则有牌的人得1分,没牌的人0分。求期望得分。

    **Solution:**

    涉及博弈论的混合策略博弈里纳什均衡的概念。可以看https://doc.mbalib.com/view/f28a788b169d786df80d9c19ed6d4326.html来学习。 因为本题是零和博弈,可以转化为经典矩阵游戏,利用单纯形来解决。当然外层需要套一个dp,dp[ S ] [ T ] 表示两个人的牌集合分别是S和T时先手的期望得分,转移对应一个|S|*|T|的矩阵游戏。

    ### Problem I:

    求$F_p​$ 域下$n​$阶irreducible monic多项式的数量mod $m​$。

    **Solution:**

    抽象代数题。

    以下多项式均默认monic。

    最优美的解法是利用定理:

    给定质数$p$和$n$,$F_p $所有度是n的约数的不可约多项式的乘积等于$x^{p^n}-x$

    设$N(n)$ 为所有度为n的不可约多项式个数。

    则根据上面的定理等式两边度相同,可以推出$sum_{d | n}dN(d) = p^n$

    莫比乌斯反演一下就可以求出$N(n)$.

    ## Day5:

    **Problem J:**

    求把排列A变成排列B置换环个数。

    $AB$都是矩阵,$A_{ij} = (i-1)*m+j, B_{ij} = (j-1)*n+i$.

    **Solution:**

    首先把矩阵一行一行接起来变成数组,然后所有标号换成从0开始。

    则$x=i*m+j​$

    $P_x=j*n+i$

    $P_x equiv nx (mod mn-1)$

    然后随便搞搞就可以了。

    ## Day6:

    Problem A:

    给出正整数A, B.

    只能做4种操作:A+=A, B+=B, A+=B, B+=A. 要求3000步内使A=B。

    Solution:

    首先如果某个操作序列可以让$(kx, ky)$变成$(kz, kz)$, 也一定可以让$(x,y)$变成$(z, z)$.

    如果$A,B$都是偶数,可以都除以2,否则如果一奇一偶,可以让奇数自己加自己一次,然后就可以都除以2. 因此每次至少有一个数除以2.

    如果都是奇数,大的加小的一次,然后小的自己加自己一次,然后就可以都除以2. 这种操作的结果会导致两数的差除以2.

    因此大概$O(logV)^2$ 步就可以了。

  • 相关阅读:
    Linux内核文档:包含 kernel-doc 注释
    Linux内核文档:如何写符合 kernel-doc 规范的注释
    [记录点滴] 使用工具和命令对redis数据进行备份恢复
    聊聊CMDB的前世今生
    我是如何走上运维岗位的?谈谈新人入职运维发展的注意事项
    如何从生命周期的视角看待应用运维体系建设?
    标准化体系建设(下):如何建立基础架构标准化及服务化体系?
    标准化体系建设(上):如何建立应用标准化体系和模型?
    微服务架构时代,运维体系建设为什么要以“应用”为核心?
    lsattr命令
  • 原文地址:https://www.cnblogs.com/vb4896/p/10652710.html
Copyright © 2011-2022 走看看