ABC245 Ex - Product Modulo 2

考虑将其拆分为\(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;
		}
	}
posted @ 2022-04-01 20:37  fhq_treap  阅读(129)  评论(0编辑  收藏  举报