• 2020.10.24【NOIP提高A组】模拟


    2020.10.24【NOIP提高A组】模拟

    6831.【NOIP提高A组】T1.lover

    数位dp + 四维前缀和

    数位积 (dig(x)) 可以表示为 (2^a3^b5^c7^d) 的形式, 所以对于所有 ((a, b, c, d)) 分别求出 (dis(x) = 2^a3^b5^c7^d)(x) 的个数, 设 (f[i][0/1][a][b][c][d]) 表示从高到低第 (i) 位, 是否顶格, 前为 ((a, b, c, d)) 的方案数, 发现前两维可以压掉, 转移枚举填哪个数字即可, 注意判断上界

    (g[a][b][c][d]) 表示 (gcd)((a, b, c, d)) 的方案数, 记 (h[a][b][c][d])(g) 的后缀和, (f'[a][b][c][d])(f) 的后缀和, 然后可以__"发现"__ (h[a][b][c][d] = f'[a][b][c][d] ^ 2), 于是我们可以求出 (h) 然后逆推回 (g), 最后枚举合法的 ((a, b, c, d)) 统计答案即可

    高维后缀和的求法


    6832.【NOIP提高A组】T2.world

    首先需要发现, 每次变化其实就是 (i ightarrow 2i) (mod) ((n + 1))

    (30ptes)

    由此可以得出, 一个世界是幸运的__充要条件__是 (n) 为 最小的 (k) 使得 (2^k equiv 1) ((mod) ((n + 1)))

    (o(n ^ 2)) 枚举第一个数即可

    (40 ptes)

    观察 (2^k equiv 1) ((mod) ((n + 1)))

    由欧拉定理可得 : (2^{phi(n + 1)} equiv 1) ((mod) ((n + 1))) (n为偶数, 所以 (gcd(2, n + 1) = 1))

    ((n + 1)) 不为质数时, (phi(n + 1) < n), 此时无法满足充要条件

    所以只在 ((n + 1)) 为质数时判断, 时间复杂度 (O(frac{n^2}{logn}))

    (50ptes)

    如果 ((n + 1)) 为质数, 那么 (n) 一定满足 (2^n equiv 1) ((mod) ((n + 1))), 那么如果最小的 (k) 不为 (n) 的话, 则一定为 (n) 的约束, 枚举 (n) 的约数判断即可

    时间复杂度 (O(nlogn)) (约数个数均摊为 (O(logn)))

    (100pts)

    考虑将 (n) 分解质因数 (n = p_1^{c_1}p_2^{c_2}p_3^{c_3}...p_k^{c_k}), 如果 (n)不是最小的 (k), 那么 (exists p in) {(p_1, p_2) ... (p_k)}, (2^{frac{n}{p}} equiv 1) (mod() ((n + 1)))

    (10^7) 内不同的质因子个数最多只有8个, 枚举质因数判断即可

    时间复杂度 (O(8n))

    6834.【NOIP提高A组】T4.onmyodo

    一道套着博弈外壳的dp题,改了好久,差评!

    首先通过一系列操作可以得出一个结论:(n) 为奇数时先手必胜。

    可以发现,(n) 为偶数时,若排列数为偶数,则先手必胜,证明:

    若操作之后 (n) 为奇数,则操作者必败,所以二者一定是不断重排直到不能排为止,由于只有偶数种排列所以先手必胜

    同理可以得出:(n) 为偶数时,若排列数为奇数,则后手必胜。

    综上,后手必胜当且仅当 (n) 为偶数且字符串不同排列个数为奇数,否则先手必胜。所以考虑用 总字符串个数 - 不同排列个数为奇数的字符串个数

    易得,一个字符串的不同排列个数为

    [frac{n!}{prod{a_i!}} ]

    (a_i) 为字符 (i) 的出现次数。

    现要求不同排列个数为奇数,也就是说 (n!) 分解质因数后的每一个 2 因子都与 (prod{a_i!}) 中 2 因子对应。

    考虑 (n!) 分解质因数后 2 因子的个数 (sum{lfloor frac{n}{2^j} floor})

    那么对于任意 (j)

    [lfloor frac{n}{2^j} floor = sum{lfloor frac{a_i}{2^j} floor} ]

    通过做差

    [lfloor frac{n}{2^j} floor - 2lfloorfrac{n}{2^{j + 1}} floor = sum{lfloor frac{a_i}{2^j} floor - 2lfloor frac{a_i}{2^{j + 1}} floor} ]

    可以直观的发现:若 (n) 二进制下第 (j) 为 0,则所有 (a_i) 二进制下第 (j) 位为 0,若为 1,则有且只有一个 (a_i) 二进制下第 (j) 位为 1。

    (f_{i, j}) 表示选了 (i) 个不同字符,(a_i) 的异或和为 (j) 且 任意 (a_i) 不为 0 ,

    [f_{i, j} = prod{frac{1}{a_i!}} ]

    转移很巧妙,每次我们强制当前字符必须要选 (n) (xor) (j) 二进制下的最低位,然后枚举高位的子集转移。

    最后排列数为奇数的字符串个数为 (sum{f_{i, n} imes n! imes A_{m}^{i}}),答案即为 (n! - sum{f_{i, n} imes n! imes A_m^i})

  • 相关阅读:
    DG查看恢复进度
    dataguard主备延迟多长时间的查询方法
    DG动态性能视图详解
    Django之ORM的增删改查操作流程
    IPython
    render函数和redirect函数的区别+反向解析
    http状态码
    图的基本概念
    图的遍历
    vue之webpack打包工具的使用
  • 原文地址:https://www.cnblogs.com/zhouzj2004/p/13893929.html
Copyright © 2020-2023  润新知