题目链接
题意
给一个数组,可以删除其中的元素。要求是找到使各个元素之和是合数的最大子集
思路
题目不是很难,分两种情况。首先如果原本数组一开始的和就是合数的话,那么直接原数组输出就好了。如果不是的话,只需要去掉一个奇数就好了。是因为,偶数必然为合数,如果现在的和为质数,那么他必然为奇数。奇数-偶数=奇数,不一定符合要求;但是奇数-奇数=偶数,必然是合数。此时子集长度为n-1显然符合要求。
代码
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define Endl "\n"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 1e5+5;
const int INF = 0x3f3f3f;
const int mod = 1e9 + 7;
const double pi = acos(-1);
inline ll read(){
ll x = 0, f = 1; char ch; ch = getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,sum;
int a[maxn];
bool isprime(int x)
{
for(int i=2;i<x;i++)
{
if(x%i==0)
return 0;
}
return 1;
}
void solve() {
n=read();
sum=0;
for(int i=1;i<=n;i++)
{
a[i]=read();
sum+=a[i];
}
if(sum%2==0||!isprime(sum))
{
cout<<n<<Endl;
for(int i=1;i<=n;i++)
cout<<i<<" ";
cout<<Endl;
}
else
{
cout<<n-1<<Endl;
int ok=0;
for(int i=1;i<=n;i++)
{
if(a[i]%2==0)
cout<<i<<" ";
else if(a[i]%2!=0&&!ok)
{
ok=1;
}
else
cout<<i<<" ";
}
cout<<Endl;
}
return ;
}
int main() {
for(int T = read(); T; T--)
solve();
return 0;
}