2020.10.24【NOIP提高A组】模拟 2020.10.24【NOIP提高A组】模拟

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})