【启智树NOIP模拟】奇偶【卢卡斯定理】【背包】【bitset】

题意:给定 n n n 个数 a i a_i ai ,求选出(可以重复,考虑顺序) M M M 个数和为 S S S 的方案数模 2 2 2

n ≤ 200 , a i ≤ 1 0 5 , M , S ≤ 1 0 18 n\leq 200,a_i\leq 10^5,M,S\leq 10^{18} n200,ai105,M,S1018

首先给每个数分配一个出现次数 c i c_i ci,这个 c c c 贡献的方案数为

M ! c 1 ! c 2 ! … c n ! \frac{M!}{c_1!c_2!\dots c_n!} c1!c2cn!M!

( M c 1 ) ( M − c 1 c 2 ) ( M − c 1 − c 2 c 3 ) … \binom{M}{c_1}\binom{M-c_1}{c_2}\binom{M-c_1-c_2}{c_3}\dots (c1M)(c2Mc1)(c3Mc1c2)

写出 M , c i M,c_i M,ci 的二进制,发现上式为奇数当且仅当 c 1 ∣ c 2 ∣ c 3 … ∣ c n = M c_1|c_2|c_3\dots|c_n=M c1c2c3cn=M

证明:考虑模 2 2 2 意义下的卢卡斯定理,对于组合数 ( a b ) \binom{a}{b} (ba),该式为 0 0 0 当且仅当二进制某个对应位置 a a a 0 0 0 b b b 1 1 1。也就是说,整个式子为 1 1 1 当且仅当每个组合数下面都是上面的子集。通过归纳法就可以证明。

如果想找个没这么启发式的证明,可以考虑对于 2 2 2 ruler ⁡ ( x ) = 2 x − count ⁡ ( x ) \operatorname{ruler}(x)=2x-\operatorname{count}(x) ruler(x)=2xcount(x)

这意味着:对于 M M M 每一个为 1 1 1 的位 i i i,都可以且必须选 2 i 2^i 2i 个相同的数。

所以从高到底考虑 S S S 的每一位做个背包,设 f ( i , j ) f(i,j) f(i,j) 表示考虑到第 i i i 位剩下 j j j 的空间的方案数,每枚举一位就把这个空间乘以 2 2 2 加上这一位的数。因为 a i a_i ai 只有 1 0 5 10^5 105,所以这个 j j j 不用记太大,用 bitset 优化即可。

复杂度 O ( T n a i log ⁡ S / w ) O(T na_i\log S /w) O(TnailogS/w)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <bitset>
using namespace std;
typedef long long ll;
const int N=2e5;
int a[205];
bitset<N+5> f[2];
int main()
{
	int T;
	scanf("%d",&T);
	while (T--)
	{
		ll M,S;
		int n;
		scanf("%lld%lld%d",&M,&S,&n);
		for (int i=1;i<=n;i++) scanf("%d",&a[i]);
		f[0].reset(),f[1].reset();
		f[0].set(0);
		for (int d=60;d>=0;d--)
		{
			f[1].reset();
			for (int i=0;((i<<1)|((S>>d)&1))<=N;i++) if (f[0][i]) f[1].set((i<<1)|((S>>d)&1));
			f[0]=f[1];
			if ((M>>d)&1)
			{
				f[0].reset();
				for (int i=1;i<=n;i++) f[0]^=(f[1]>>a[i]);
			}		
			else f[0]=f[1];
		}
		cout<<f[0][0]<<'\n';
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
启智 ROS 用户手册是一本为启智机器人的用户提供的操作指南。该手册的目的是帮助用户了解和掌握如何使用ROS(机器人操作系统)来控制和使用启智机器人。 用户手册以简洁明了的方式介绍了ROS的基本概念和工作原理,以及启智机器人与ROS的衔接方式。手册首先解释了ROS的基本概念,包括节点、话题和服务等,以帮助用户在理解整个ROS系统的基本结构后进行操作。 手册还介绍了如何安装和配置ROS环境,包括安装ROS核心软件和运行必需的依赖。它提供了一步一步的说明,指导用户正确地配置ROS环境,以确保启智机器人与ROS之间的通信正常运行。 用户手册还说明了启智机器人在ROS中的使用方法。它详细介绍了启智机器人的ROS软件包,包括如何启动机器人节点、控制机器人运动和获取传感器数据等。手册通过示例代码和命令解释了每个功能的使用方式,以帮助用户快速上手使用启智机器人。 此外,用户手册还提供了一些常见问题和故障排除的解决办法。用户可以在手册中找到对于常见问题的解答,以便更好地解决遇到的问题。 总而言之,启智 ROS 用户手册是一本全面而详细的操作指南,旨在帮助用户正确地使用ROS控制和操作启智机器人。通过阅读该手册,用户可以了解ROS基本概念、配置ROS环境以及如何使用ROS控制启智机器人,同时也可以学习到如何解决常见问题和故障排除。这本手册对于启智机器人的用户来说是一份宝贵的参考资料,有助于他们更好地利用ROS技术来控制和应用启智机器人。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值