NOIP2002-普及组复赛-第三题-选数

题目描述 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。
  现在,要求你计算出和为素数共有多少种。
  例如上例,只有一种的和为素数:3+7+19=29)。

输入输出格式 Input/output

输入格式:
键盘输入,格式为:
n , k (1<=n<=20,k<n)
x1,x2,…,xn (1<=xi<=5000000)
输出格式:
屏幕输出,格式为:
一个整数(满足条件的种数)。

输入输出样例 Sample input/output

样例测试点#1

输入样例:

4 3
3 7 12 19

输出样例:

1

思路:模拟,不解释!

代码如下:

 1 //使用数组input保存各个数字是否被用过的标志,使用数组a保存输入的数字
 2 #include <stdio.h>
 3 #include <math.h>
 4 #include <string.h>
 5 int sort=0,n,k,a[40];
 6 int sushu(int x) //是素数返回1,不是返回0
 7 {
 8     int i,y;
 9     y=sqrt(x);
10     for(i=2;i<=y;i++)
11         if(x%i==0)
12             return 0;
13     return 1;
14 }
15 void f(int input[],int pos,int m) //f(被操作数组,所在位置,选m个数)
16 {
17     if(m==0)
18     {
19         int j,sum=0;
20         for(j=0;j<n;j++)
21             if(input[j]==1)
22                 sum+=a[j];
23         if(sushu(sum)==1)
24             sort++;
25         return;
26     }
27     else
28     {
29         int i;
30         for(i=pos;i<n;i++)
31         {
32             if(input[i]==0)
33                 input[i]=1;
34                 f(input,i+1,m-1);
35                 input[i]=0;
36         }
37     }
38     return;
39 }
40 int main()
41 {
42     int input[40],i;
43     scanf("%d%d",&n,&k);
44     for(i=0;i<n;i++)
45         scanf("%d",&a[i]);
46     memset(input,0,sizeof(int)*40);
47     f(input,0,k);
48     printf("%d\n",sort);
49     return 0;
50 }    
时间: 2024-08-24 14:54:24

NOIP2002-普及组复赛-第三题-选数的相关文章

NOIP2005-普及组复赛-第三题-采药

题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值.我会给你一段时间,在这段时间里,你可以采到一些草药.如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大.” 如果你是辰辰,你能完成这个任务吗? 输入输出格式 Input/output 输入格式:输

普及组2006第三题jam的计数法

P1061 Jam的计数法 题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩. 在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母.我们把这样的"数字"称为Jam数字.在Jam数字中,每个字母互不相同,而且从左到右是严格递增的.每次,Jam还指定使用字母的范围,例如,从2到10,表示只能使用{b,c,d,e,f,g,h,i,j}这些字母.

NOIP2014-普及组复赛-第三题-螺旋矩阵

题目描述 Description 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序,在格子中依次填入1, 2, 3, ... , n,便构成了一个螺旋矩阵.2 下图是一个n = 4 时的螺旋矩阵. 1     2     3     4 12    13    14    5 11    16    15    6 10     9     8     7

C++ P1318 Jam的计数法(NOIP2006普及组复赛第3题)

#include<iostream>#include<cstdio>using namespace std; int s,t,w,a[30],time=5;char c[30];bool ok;//ok表示是否找到规定集合: void data_in()//使用位向量法: { scanf("%d%d%d",&s,&t,&w); scanf("%s",c); for(int i=0;i<w;i++) a[c[i]-

NOIP2016普及组复赛解题报告

提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:https://www.luogu.org/problem/show?pid=2010 T3:https://www.luogu.org/problem/show?pid=2058 T4:https://www.luogu.org/problem/show?pid=2119) 不得不说,亲历了14.1

NOIP2002普及组解题报告

过河卒 分析:简单递推题.注意答案要longlong #include<iostream> #include<algorithm> using namespace std; int dx[10]={0,-1,-1,1,1,2,2,-2,-2},dy[10]={0,2,-2,2,-2,1,-1,1,-1}; bool book[25][25]; long long f[25][25]; int main(){ int n,m,x,y; cin>>n>>m>

[NOIP2002] 普及组

产生数 预处理出一个数能变成多少种数,然后遍历原串的每一位,累乘方案数即可. 需要用到高精度. 1 /*By SilverN*/ 2 #include<iostream> 3 #include<cstdio> 4 #include<algorithm> 5 #include<cstring> 6 #include<cmath> 7 using namespace std; 8 char s[35]; 9 int ans[300],len; 10

NOIP2014-普及组复赛-第四题-子矩阵

题目描述 Description 给出如下定义: 1. 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素得到一个2*3的子矩阵如右图所示. 9   3   3   3   9 9   4   8   7   4 1   7   4   6   6 6   8   5   6   9 7   4   5   6   1 的其中一个2*3的子矩阵是4   7   48   6

博弈论(noip普及组2010第四题 三国游戏)

小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有 N 位武将(N为偶数且不小于 4),任意两个武将之间有一个“默契值”,表示若此两位武将作为一对组合作战时,该组合的威力有多大.游戏开始前,所有武将都是自由的(称为自由武将,一旦某个自由武将被选中作为某方军队的一员,那么他就不再是自由武将了),换句话说,所谓的自由武将不属于任何一方. 游戏开始,小涵和计算机要从自由武将中挑选武将组成自己的军队,规则如下:小涵先从自由武将