题意:
有一个严格递增的数组 a a a,另有一数组 b , b 1 = a 1 , b i = b i − 1 ∧ a i ( i > = 2 ) b,b_1=a_1,b_i=b_{i−1}∧a_i(i>=2) b,b1=a1,bi=bi−1∧ai(i>=2),问满足使 b b b 严格递增的数组 a a a 的个数
因为 a a a 严格递增,所以若想使 b b b 也严格递增则同一最高位在 a a a 中至多出现一次,比如 2 , 3 2,3 2,3 只能有一个,也可以都不选。
每个最高位可选的情况有 m i n ( 2 ( v + 1 ) − 1 , d ) − 2 v + 1 + 1 min(2(v+1)−1,d)−2v+1+1 min(2(v+1)−1,d)−2v+1+1 个,
第二个 + 1 +1 +1 代表不选取最高位为该位的数,也因此最后乘积需要减去一个所有位都没选取的情况。
AC代码:
const int N = 1e5 + 10;
int n, m, d;
int main()
{
int t;
sd(t);
while (t--)
{
sdd(d, m);
int b[32] = {};
int t = d;
for (int i = 0; t; i++)
{
b[i] = min((1 << (i + 1)) - 1, d) - (1 << i) + 2;
t >>= 1;
}
ll ans = 1;
for (int i = 0; b[i]; i++)
ans = ans * b[i] % m;
ans--;
ans += m;
ans %= m;
pd(ans);
}
return 0;
}