所以 p 不整除这个东西,意思是要让分母的 p 因子数量 ≥ 分子的 p 因子数量。 乍一看这个 n 这么大,整数拆分、dp 之类的啥都做不了,吓死个人。
冷静分析.jpg 首先,这整个分式最终必然得到一个整数(因为这是在计算方案数),这意味着分母的 p 因子数量一定是 ≤ 分子的 p 因子数量的。而我们的目标又是“分母的 p 因子数量 ≥ 分子的 p 因子数量”,因此可得:1、我们要让分母、分子的 p 因子数量相等;2、这等价于让分母的 p 因子数量最大化。
有了这个目标,就能隐约感觉到,a 数列不会长得太奇怪,肯定有限制的。 接下来就来排除掉一些情况。
会不会有环长 r>p 却又不是 p 的倍数呢? 注意到这时候 rar 是没有贡献的,这太浪费了,我们把这 ar 个长度为 r 的环,每个抽 p 出来,组成 ar 个长度为 p 的环,发现贡献至少多了 ar。说明这种情况下分母的 p 因子数量没有最大化。
会不会有环长 r=kp(k>1)呢? 同理啊,全部换成环长为 p 会使贡献增大:单个 r 的贡献从 1+(k的p因子数量) 变成 k,正常情况下后者都会大于前者;而 ar! 部分的贡献从 ar! 变成 ap!(ap+ar)!,不会更劣。 唯一使得单个 r 贡献保持不变的是 k=p=2,但这会在 ar! 部分增大贡献。 所以也不合法。
所以这就说明 ai 非零的只有 i∈[1,p] 了。
我们可以先想像一种初始情况:a1=n,这显然是一个合法解。然后看看怎么能把 a1 里的东西拿到 a2,⋯,ap 里去,而保持 p 因子数量不变。
先考虑 nmodp=0。 当然可以想到 a1 举家迁移到 ap,贡献从 ∑j=1∞⌊pjn⌋ 变成 pn+∑j=2∞⌊pjn⌋,没有变化。如果只是抽 a1 的一部分放到 ap 里去呢?由于在 p 的幂的位置,a1! 的 p 因子数量都会有一次大的提升,所以构成 p 的幂的连续段不能拆开考虑,否则 p 因子数量一定会减少。比如 a1=14,p=2,那么相当于把 a1 分成长度为 8,4,2 的三个段,每个段要么留在 a1 要么搬到 ap 更一般地说,设 n 的 p 进制表示为 b1b2⋯bm,那么每个二进制位下的每个单位“1”可以选择留在 a1 或搬到 ap,因此对答案的贡献为 ∏i=1m−1(bi+1)。(为啥是 m−1?最低位一定是 0,如果不是 0 的话是下面的情况)
再考虑 nmodp>0。 显然这个多出来的部分放哪都无所谓,都不会产生任何 p 因子,因此这里对答案的贡献是 nmodp 的可重整数拆分。
综上,答案为
ans=part(nmodp)⋅i=1∏m−1(bi+1)
其中 b1b2⋯bm 是 n 的 p 进制表示,part 表示可重整数拆分方案数。后者五边形数 O(nn) 或者 O(nlogn) 预处理一下就完事了。