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) 为偶数且字符串不同排列个数为奇数,否则先手必胜。所以考虑用 总字符串个数 - 不同排列个数为奇数的字符串个数。
易得,一个字符串的不同排列个数为
(a_i) 为字符 (i) 的出现次数。
现要求不同排列个数为奇数,也就是说 (n!) 分解质因数后的每一个 2 因子都与 (prod{a_i!}) 中 2 因子对应。
考虑 (n!) 分解质因数后 2 因子的个数 (sum{lfloor frac{n}{2^j} floor})
那么对于任意 (j) 有
通过做差
可以直观的发现:若 (n) 二进制下第 (j) 为 0,则所有 (a_i) 二进制下第 (j) 位为 0,若为 1,则有且只有一个 (a_i) 二进制下第 (j) 位为 1。
设 (f_{i, j}) 表示选了 (i) 个不同字符,(a_i) 的异或和为 (j) 且 任意 (a_i) 不为 0 ,
转移很巧妙,每次我们强制当前字符必须要选 (n) (xor) (j) 二进制下的最低位,然后枚举高位的子集转移。
最后排列数为奇数的字符串个数为 (sum{f_{i, n} imes n! imes A_{m}^{i}}),答案即为 (n! - sum{f_{i, n} imes n! imes A_m^i})