小数据做法
对于 n≤5, ai≤5 的数据,可以直接枚举所有可能的序列 b。
对每个 i,bi+n 必须是 ai 的因子,bi 必须是 bi+n 的因子。先把每个位置所有合法的 (bi,bi+n) 列出来,再做 DFS 枚举所有组合,最后检查
i=1∏nbi+n≤i=1∏nbi2
即可。
小数据下因子数量很少,这种做法可以通过。
单质数做法
如果所有 ai 都是 2 的幂,设
ai=2ci.
令 bi+n 中 2 的指数为 ki,bi 中 2 的指数为 ti。由于 bi∣bi+n∣ai,有
0≤ti≤ki≤ci.
条件 2 等价于
i=1∑nki≤2i=1∑nti,
也就是
i=1∑n(2ti−ki)≥0.
于是可以做背包 DP。设 dp[i][s] 表示考虑前 i 个位置,当前 ∑(2t−k)=s 的方案数。转移时枚举 ki,ti。由于指数总和不超过 100log2109,状态数是可接受的。
100 分做法
直接统计不等式一侧会遇到多个质数之间的耦合。关键是利用对称性。
对于每个 i,令
xi=bi,yi=bibi+n.
因为 bi∣bi+n,所以 yi 是正整数。又因为 bi+n∣ai,所以
xiyi∣ai.
条件 2 变为
i=1∏nxiyi≤i=1∏nxi2,
即
i=1∏nyi≤i=1∏nxi.
现在所有合法选择就是若干组 (xi,yi),满足 xiyi∣ai。如果把所有 (xi,yi) 同时交换成 (yi,xi),仍然满足 xiyi∣ai,并且会把
∏yi<∏xi
的方案一一对应到
∏yi>∏xi
的方案。
设:
- S 表示只要求 xiyi∣ai 的总方案数;
- E 表示额外满足 ∏xi=∏yi 的方案数。
那么答案就是
2S+E.
在模 998244353 意义下,除以 2 等价于乘以 499122177。
计算总方案数 S
对每个 ai 独立计算。
若某个质数 p 在 ai 中的指数为 c,设 p 在 xi 中的指数为 α,在 yi 中的指数为 β。条件 xiyi∣ai 等价于
α+β≤c.
满足这个条件的非负整数对 (α,β) 有
α=0∑c(c−α+1)=2(c+1)(c+2)
种。
不同质因子互相独立,不同的 i 也互相独立,所以把所有这些值相乘即可得到 S。
计算取等方案数 E
取等条件
∏xi=∏yi
等价于对每个质数 p,p 在两边的总指数相等。也就是说,如果 p 在 xi 中的指数是 αi,在 yi 中的指数是 βi,那么需要满足
i=1∑n(αi−βi)=0.
不同质数之间仍然独立,因此可以对每个质数 p 分别做一次 DP,最后把结果相乘。
对于固定的质数 p,设 ci 是 p 在 ai 中的指数。我们要统计有多少种选择满足:
αi≥0,βi≥0,αi+βi≤ci,
并且
∑(αi−βi)=0.
设 C=∑ci,所有可能的指数差只会落在 [−C,C] 中。
用一维背包:
dp[s]=当前指数差为 s 的方案数.
处理一个指数 ci 时,枚举所有满足 α+β≤ci 的二元组,令贡献为
Δ=α−β.
然后做转移
ndp[s+Δ]+=dp[s].
实现时可以先把同一个 ci 下每种 Δ 的出现次数预处理出来,这样一次转移只需要枚举 O(ci) 个不同的 Δ,不用枚举全部二元组。
对于这个质数,最终的 dp[0] 就是它对 E 的贡献。
复杂度
质因数分解直接试除即可。因为 ai≤109,每个数最多试到 ai。
对于每个质数 p,记 Cp 为它在所有 ai 中的总指数。DP 的状态数是 O(Cp),每次转移枚举的指数差数量也是 O(ci),总复杂度可以看作
O(p∑Cp2),
在本题范围内可以轻松通过。