【Luogu P4317】花神的数论题

题目大意:

\(\text{sum}(i)\) 表示 \(i\) 的二进制表示中 \(\texttt{1}\) 的个数,求 \(\prod_{i=1}^{N}\text{sum}(i)\)

正文:

本题正解是数位DP,但是组合数 \(C_{n}^{m}\) 正好可以表示 \(n\) 位的二进制数中 \(\texttt{1}\) 的个数,我们就可以用到组合数逐位搜索解决本题。

考虑到答案是所有数的积,所以假设搜到第 \(i\) 位, 有 \(j\) 个一,它的价值是 \(j^{C_i^j}\) 而并非 \(j\cdot{C_i^j}\)。但此时的答案还是错误的,因为是逐位搜索,还需要添加一个计数器 \(t\) 代表搜过的位数。

代码:

for (int i = 60; i >= 0; --i)
{
	if(!((n>>i) & 1)) continue;
	for (int j = 0; j <= i; j++)
		if(j + t) ans = ans * qpow(j + t, C[i][j]) % mod;
	++t;
}
printf("%lld", ans * t % mod);
posted @ 2020-04-19 23:42  Jayun  阅读(110)  评论(1编辑  收藏  举报