考虑将其拆分为\(M = \prod p_i^{q_i}\)
知只要对 \(X = N (\bmod p_i^{q_i})\) 求解最后方案数乘起来即可。
不妨考虑求出 \(N\) 中 \(p\) 的数量,此时发现一定有只要 合理分配 \(p\) 的位置,总可以在最后一位调整出 \(X = N (\bmod p_i^{q_i})\)
此时我们需要分类讨论,如果 \(N \bmod p\) 不为 \(0\),那只需要分配即可,方案计算式如下:
\(\binom{k + d - 1}{d} * \phi(p^{q})^{k - 1}\)
若为 \(0\) 则需要讨论进行,因为此时我们需要把 \(p\) 个数变为 $ >= q$ 个,那么我们不妨使用容斥,我们依次减去分配了 \(0...q - 1\)个位置的方案。
此时的柿子为 \((p^{q + k}) - \sum_{d = 0}^{q - 1}\binom{k + d - 1}{d} * \phi(p^{q})^{k - 1}*\phi(p^{q - d})\)
注意此时比较上面的柿子多出 \(\phi(p^{q - d})\),因为上面的最后一位由于有乘积限制固定,而这个柿子没有这个限制。
点击查看代码
for(auto [p,q]:A){
ll u=pow(p,q)+0.1,x=n%u;
if(x){
int d=0;
while(x%p==0)++d,x/=p;
ans=1LL*ans*C(k+d-1,d)%mod*qpow((p-1)%mod*qpow(p%mod,q-1)%mod,k-1)%mod;
}
else{
int all=qpow(u%mod,k);
for(int d=0;d<q;++d){
all=(all+1LL*(mod-C(k+d-1,d))*qpow((p-1)%mod*qpow(p%mod,q-1)%mod,k-1)%mod*(qpow(p%mod,q-d)-qpow(p%mod,q-d-1)+mod))%mod;
}
ans=1LL*ans*all%mod;
}
}