hey_left 10 Codeforces Round 871 (Div. 4) 再续
H.
没思路,查看题解
选择数组的非连续的子序列,就是每个数选或不选的问题
求个数,易dp
求子序列的数二进制相与结果有k个1的个数
把所有结果记录,再去筛选满足条件的结果
f[i][j]表示到第i个数,相与结果为j的子序列个数
正向思维:多个数相与得到结果
dp思维:枚举结果,考虑数如何相与得到
对于每个数:
不选:dp[i][j]+=dp[i-1][j]
选 :dp[i][j&a[i]]+=dp[i]j
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
const int N=2e5+10;
int ans,n,k;
int num1(int x){
int cnt=0;
while(x){
if(x&1)cnt++;
x/=2;
}
return cnt;
}
void solve(){
cin>>n>>k;ans=0;
vector<int>a(n+1);
vector<vector<int>>f(n+1,vector<int>(100));
for(int i=1;i<=n;i++){
cin>>a[i];f[i][a[i]]=1;
}
for(int i=1;i<=n;i++){
for(int j=0;j<64;j++){
f[i][j]=(f[i][j]+f[i-1][j])%mod;
f[i][j&a[i]]=(f[i][j&a[i]]+f[i-1][j])%mod;
}
}
for(int i=0;i<64;i++){
if(num1(i)==k)ans=(ans+f[n][i])%mod;
}
cout<<ans<<'\n';
}
signed main(){
int hey_left=1;
cin>>hey_left;
while(hey_left--){
solve();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2023-01-20 寒假训练第三周