【Luogu P4317】花神的数论题

题目大意:

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

正文:

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

考虑到答案是所有数的积,所以假设搜到第 (i) 位, 有 (j) 个一,它的价值是 (j^{C_i^j}) 而并非 (jcdot{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);
原文地址:https://www.cnblogs.com/GJY-JURUO/p/12735112.html