demo2

root 站长 2023-08-02 17:41:47 2023-08-02 17:41:58 0
已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。

从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。

例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:

3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34。

现在,要求你计算出和为素数的方案共有多少种。

例如上例,只有一种的和为素数:3+7+19=29。

输入格式
第一行两个整数:n , k (1<=n<=20,k<n)

第二行n个整数:x1,x2,…,xn (1<=xi<=5000000)

输出格式
一个整数(满足条件的方案数)。

样例
输入数据 1
4 3
3 7 12 19
输出数据 1
1
{{ vote && vote.total.up }}

共 4 条回复

Kinghero King of the summit
#pragma GCC optimize(2,3,"Ofast")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=1e2+5;
int n,k,a[MAXN];
bool flag[MAXN];
set<int> cnt;
bool check(int x){
	if(x<=1)	return 0;
	if(x==2)	return 1;
	for(int i=2;i*i<=x;i++){
		if(x%i==0)	return 0;
	}
	return 1;
}
void dfs(int x,int y,int z){
	if(y==k){
		if(check(z))	cnt.insert(z);
		return;
	}
	if(x==n+1)	return;
	for(int i=1;i<=n;i++){
		if(!flag[i]){
			flag[i]=1;
			dfs(x+1,y+1,z+a[i]);
			flag[i]=0;
		}
	}
}
signed main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)	cin>>a[i];
	dfs(1,0,0);
	cout<<cnt.size();
	return 0;
}
DKX
#pragma GCC optimize(2,3,"Ofast")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=25;
int n,k,cnt,a[MAXN];
bool flag[MAXN];
bool check(int x){
	if(x<=1)	return 0;
	if(x==2)	return 1;
	for(int i=2;i<=x/i;i++){
		if(x%i==0)	return 0;
	}
	return 1;
}
void dfs(int x,int y,int z,int w){
	if(y==k){
		if(check(z))	cnt++;
		return;
	}
	if(x==n+1)	return;
	for(int i=w+1;i<=n;i++){
		if(!flag[i]){
			flag[i]=1;
			dfs(x+1,y+1,z+a[i],i);
			flag[i]=0;
		}
	}
}
signed main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)	cin>>a[i];
	dfs(1,0,0,0);
	cout<<cnt;
	return 0;
}
DKX
#pragma GCC optimize(2,3,"Ofast")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=25;
int n,k,a[MAXN];
bool flag[MAXN];
set<int> cnt;
bool check(int x){
	if(x<=1)	return 0;
	if(x==2)	return 1;
	for(int i=2;i<=x/i;i++){
		if(x%i==0)	return 0;
	}
	return 1;
}
void dfs(int x,int y,int z,int w){
	if(y==k){
		if(check(z))	cnt.insert(z);
		return;
	}
	if(x==n+1)	return;
	for(int i=w+1;i<=n;i++){
		if(!flag[i]){
			flag[i]=1;
			dfs(x+1,y+1,z+a[i],i);
			flag[i]=0;
		}
	}
}
signed main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)	cin>>a[i];
	dfs(1,0,0,0);
	cout<<cnt.size();
	return 0;
}
DKX
#pragma GCC optimize(2,3,"Ofast")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=1e2+5;
int n,k,a[MAXN];
bool flag[MAXN];
set<int> cnt;
bool check(int x){
	if(x<=1)	return 0;
	if(x==2)	return 1;
	for(int i=2;i*i<=x;i++){
		if(x%i==0)	return 0;
	}
	return 1;
}
void dfs(int x,int y,int z){
	if(y==k){
		if(check(z))	cnt.insert(z);
		return;
	}
	if(x==n+1)	return;
	for(int i=1;i<=n;i++){
		if(!flag[i]){
			flag[i]=1;
			dfs(x+1,y+1,z+a[i]);
			flag[i]=0;
		}
	}
}
signed main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)	cin>>a[i];
	dfs(1,0,0);
	cout<<cnt.size();
	return 0;
}