Codeforces 1330 D. Dreamoon Likes Sequences

在这里插入图片描述

题意:

有一个严格递增的数组 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 b 严格递增的数组 a a 的个数

因为 a a 严格递增,所以若想使 b b 也严格递增则同一最高位在 a a 中至多出现一次,比如 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 个,

第二个 + 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;
}
发布了786 篇原创文章 · 获赞 460 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/qq_43627087/article/details/105319329