题目大意:
设 ( 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);