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 \rightarrow 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} \rfloor}\)
那么对于任意 \(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} \times n! \times A_{m}^{i}}\),答案即为 \(n! - \sum{f_{i, n} \times n! \times A_m^i}\)

浙公网安备 33010602011771号