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\) 为偶数且字符串不同排列个数为奇数,否则先手必胜。所以考虑用 总字符串个数 - 不同排列个数为奇数的字符串个数

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

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

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

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

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

那么对于任意 \(j\)

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

通过做差

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

可以直观的发现:若 \(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} \times n! \times A_{m}^{i}}\),答案即为 \(n! - \sum{f_{i, n} \times n! \times A_m^i}\)

posted @ 2020-10-28 22:23  buzzhou  阅读(130)  评论(0)    收藏  举报