题意:
解法:
如果序列总和s是奇数,
或者可行性背包dp一下发现d[s/2]=0,
说明本来就不能拆分,输出0即可.
下面考虑可以拆分的情况:
假设序列中存在奇数,那么删掉一个奇数即可,因为这样会使得s是奇数.
否则一定存在一个最大的k,满足所有数都是2^k的倍数,
将所有数除以2^k,显然这样不影响答案,
除完之后一定能找到一个奇数,删掉这个奇数即可,
因为原序列都是2^k的倍数,删掉之后一定会有奇数个2^k无法被拆分.
这个2^k其实就是min(lowbit(a[i])),
因此我们只需要找到min(lowbit(a[i]))所在的位置即可.
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e6+5;
int d[maxm];
int a[maxm];
int n;
void init(){
}
int lowbit(int i){
return i&-i;
}
void solve(){
cin>>n;
int s=0;
for(int i=1;i<=n;i++){
cin>>a[i];
s+=a[i];
}
d[0]=1;
for(int i=1;i<=n;i++){
for(int j=s;j>=a[i];j--){
d[j]|=d[j-a[i]];
}
}
if(s%2||!d[s/2]){
cout<<0<<endl;
return ;
}
int ans=1e9,pos=-1;
for(int i=1;i<=n;i++){
int t=lowbit(a[i]);
if(t<ans){
ans=t,pos=i;
}
}
cout<<1<<endl<<pos<<endl;
}
signed main(){
ios::sync_with_stdio(0);
solve();
return 0;
}