枚举子集
枚举子集
发现自己经常记不住这个怎么写,就来写篇题解吧。
首先对于一个
比如:101的子集有100、001、000。
然后这个东西如果直接
所以可以用一个很厉害的东西,
代码长这样:
for(int i=(x-1)&x;i;i=(i-1)&x)
这个
这个为啥是对的呢?
我的理解是,你普通枚举
所以你把
如果只求一个
但是如果求
(好像是用什么二项式定理求出来的,但是蒟蒻不会qwq)
例题
P3773 [CTSC2017] 吉夫特
发现组合数可以用
直接
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10,mod=1e9+7;
int n,ans,f[N];
int main()
{
scanf("%d",&n);
for(int i=1,x;i<=n;i++)
{
scanf("%d",&x);
for(int j=(x-1)&x;j;j=(j-1)&x)f[j]=(f[j]+f[x]+1)%mod;
ans=(ans+f[x])%mod;
}
printf("%d",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现