P1036 选数

题目描述

已知 nn 个整数 x_1,x_2,…,x_nx1?,x2?,…,xn?,以及11个整数kk(k<nk<n)。从nn个整数中任选kk个整数相加,可分别得到一系列的和。例如当n=4,k=3n=4,k=3,44个整数分别为3,7,12,193,7,12,19时,可得全部的组合与它们的和为:

3+7+12=223+7+12=22

3+7+19=293+7+19=29

7+12+19=387+12+19=38

3+12+19=343+12+19=34。

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

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

输入格式

键盘输入,格式为:

n,kn,k(1 \le n \le 20,k<n1≤n≤20,k<n)

x_1,x_2,…,x_n (1 \le x_i \le 5000000)x1?,x2?,…,xn?(1≤xi?≤5000000)

输出格式

屏幕输出,格式为: 11个整数(满足条件的种数)。

输入输出样例

输入 #1复制

4 3
3 7 12 19

输出 #1复制

1

代码:

#include<bits/stdc++.h>
using namespace std;
int n,k;
int s[25];
bool a[25];
int sum=0,tot=0;

int prime(int x)
{
if(x==1||x==0)return 0;
for(int i=2;i<=sqrt(x);i+=1)

if(x%i==0)
return 0;
return 1;
}

int dfs(int x,int y)
{

for(int i = y; i <= n;i++)
{
if(a[i]=true)
{
a[i]=false;
sum+=s[i];
if(x==k)
{
if(prime(sum)) tot++;
}
else dfs(x+1,i+1);//i+1避免选择重复

sum-=s[i];
a[i]=true;
}
}
}

int main()
{
scanf("%d%d",&n,&k);
for(int i = 1;i <= n; i ++)
{
scanf("%d",&s[i]);
a[i]=true;
}
dfs(1,1);
printf("%d",tot);
}

原文地址:https://www.cnblogs.com/Youio-bolg/p/11330815.html

时间: 2024-10-08 16:42:50

P1036 选数的相关文章

P1036选数

P1036选数 链接 P1036 选数 思路 DFS 代码实现 #include<bits/stdc++.h> using namespace std; const int maxn = 25; typedef long long ll; ll a[maxn]; ll n,k; ll ans; bool check(ll x){ for(int i = 2; i*i <= x; i++){ if(x%i==0) return 0; } return 1; } void dfs(int x

深搜--P1036选数

深搜中绝对会用到递归 因此本题也可以使用深搜来做 bool prime(int b) { memset(sz, true, sizeof(sz)); sz[1]=false; for (int i=2;i<=b;i++) { if (sz[i]) { for (int j=2*i;j<=b;j+=i) sz[j]=false; 定义一个dfs函数来解决对数的搜索 step代表执行步数 sum代表已经选好的数据的和 cet代表已经选完的数的个数 接下来进行搜索 另外介绍下非朴素版的寻找质数的方法

洛谷P1036 选数

题目描述 已知 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,

洛谷—— P1036 选数 || Vijos——选数

https://vijos.org/p/1128|| https://www.luogu.org/problem/show?pid=1036#sub 描述 已知 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. 现在,要求你计算出和为素数共有多少种

题解 P1036 【选数】

关于 P1036 [选数] 嗯,新手试炼场的,错了两次,对,我是蒟蒻. 因为这道题对我有帮助,所以,它是好题. 错啦两次,好尬的. 49--17--100: 不费话了,过程函数与递推. 当然要递推: 49分的不说了,从未先编译一下试试. 跟着题目走,判断质数. 来一段辣鸡代码 #include<bits/stdc++.h> using namespace std; int n,k; int x[25]; int ans; bool judge_prime(int x) { for(regist

BZOJ 3930 【CQOI2015】 选数

题目链接:选数 MDZZ,这种SB题我都Wa了这么多发,彻底没救系列- 首先,我们可以发现1,如果我们选了两个不同的数,那么它们的\(\gcd\)不会超过\(r-l+1\).于是,我们可以设一个\(f_i\)表示任取\(n\)个数,它们的\(\gcd\)为\(ik\)的方案数,最后我们要的答案就是\(f_1\).我们考虑容斥一下,在求\(f_i\)的时候,先把\([l,r]\)中是\(ik\)倍数的数全部拿出来,然后任意选\(n\)个,这样选出来的数他们的\(\gcd\)一定是\(ik\)的倍数

bzoj2734【HNOI2012】集合选数

2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 831  Solved: 487 [Submit][Status][Discuss] Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中.同学们不喜欢这种具有枚举性 质的题目,于是把它变成了以下问题:对于任意一个正整数

NOIP 2002提高组 选数 dfs/暴力

1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 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. 现在,要求你计算出和为素

BZOJ 3930: [CQOI2015]选数

3930: [CQOI2015]选数 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1130  Solved: 532[Submit][Status][Discuss] Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究.然而他很快发现工作量太大了,于是向你寻求帮助.你的任务很简