专栏文章
题解:AT_abc200_d [ABC200D] Happy Birthday! 2
AT_abc200_d题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @min7qhyk
- 此快照首次捕获于
- 2025/12/01 21:56 3 个月前
- 此快照最后确认于
- 2025/12/01 21:56 3 个月前
算法:抽屉原理,状态压缩
解题思路:
抽屉原理先加证明:显而易见,在 201 个序列中必定有两个对 200 取模的余数相同。
因为 ,所以我们只需要状态压缩枚举前 8 个数列的情况总数,找到即输出。
当 时,上述情况同 , 一定有解。
- 用
vector存储状态压缩的情况,满足直接输出即可。
代码
CPP#include<bits/stdc++.h>
using namespace std;
int n,a[2001];
vector<int>f[2001];
int main()
{
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
a[i]%=200;
}
if(n>8) n=8;
for(int i=0;i<(1<<n);i++){
vector<int>v;
int s=0;
for(int j=0;j<n;j++){
if((i>>j)&1){
s=(s+a[j])%200;
v.push_back(j+1);
}
}
if(f[s].size()){
puts("Yes");
cout<<f[s].size()<<" ";
for(auto x:f[s]) cout<<x<<" ";
puts("");
cout<<v.size()<<" ";
for(auto x:v) cout<<x<<" ";
exit(0);
}
f[s]=v;
}
puts("No");
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...