当前位置:首页 > 题解目录 > 正文内容

【题解】2002-T2 选数

亿万年的星光4年前 (2021-10-04)题解目录2007

【题目描述】


已知n个整数x1,x2,xn,以及一个整数K(Kn)。从n个整数中任选k个整数相加,可分别 得到一系列的和。例如当

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


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

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

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

【输入描述】



        第一行为nk(1n20,kn)


        第二行为n个数x1x2xn(1xi5000000),各数之间用一个空格隔开)

【输出描述】

        一个整数(满足所有条件的种数)

【样例输入】

4 3 
3 7 12 19

【样例输出】

1

【题目分析】

  • 用到了判断素数

  • 简单的排列是不行的,比如3 7 12 和3 12 7 是两种不同的排列,但是加起来的结论是一样的,所以要进行简单改变


【解法一:利用组合数公式】


如果我们用的DFS把所有可能的排列情况求出来,那么肯定是重复的,既然这样,我们就用组合数公式,可以看出,组合数公式就是排序数除以m的阶乘。那么题目来说就比较简单了。

#include <bits/stdc++.h>
using namespace std;
long long n,k,sum,cnt,times,flag,a[21],vis[21];
//检测质数 
void check(long long sum) {
	flag=0;//clear
	if(sum!=2) {
		for(int i=2; i*i<=sum; i++) {
			if(sum%i==0) {
				flag=1;
				break;
			}
		}
	}
	if(sum==2) flag=0;
	if(flag==0) cnt++;
}
void dfs(long long depth) {
	if(depth==k+1) {
		check(sum);//判断是否是质数 
		return;
	}
	for(int i=1; i<=n; i++) {
		if(vis[i]!=1) {
			vis[i]=1;  //标记被使用过了 
			sum+=a[i];  //把使用过的数加起来 
			dfs(depth+1); //深搜下一个 
			sum-=a[i];
			vis[i]=0;  //回溯一步 
		}
	}
}
int main() {
	cin>>n>>k;//读入n和k 
	for(int i=1; i<=n; i++)
		cin>>a[i];
	dfs(1);
	times=1;  //阶乘
	for(int i=1; i<=k; i++) 
		times*=i;
	cout<<cnt/times<<endl;
	return 0;
}



【解法二:利用单调性筛选】


我们不能直接用DFS的方法,是因为有重复的数据,只要我们保证我们产生的数据没有重复的,就OK了。

比如,我们4选3。比较好的写法应该是

1 2 3 
1 2 4
1 3 4
2 3 4

那么我们只要保证在全排列的时候,后面的数比前面的大就能作出组合数了。


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【题解】Crossing River

【题目描述】几个人过河,每次过两人一人回,速度由慢者决定,问过河所需最短时间。【输入描述】输入t组数据,每组数据第1行输入n,第2行输入n个数,表示每个人过河的时间。【输出描述】输出t行数据,每行1个...

【题解】真分数(2019青岛市程序设计竞赛)

【描述】真分数,指的是分子比分母小的分数,真分数的分数值小于1。给出n个正整数,任取两个数分别作为分子和分母组成真分数。求能组成多少不同值的真分数。【输入】第一行是一个正整数n。第二行是n个不同的正整...

【题解】跳格子2

【题目描述】地面上有一排长度为n的格子1-n,每个格子上都有一个数xi,开始时你在位置0,每次你可以向前跳1-2格,然后取走格子上的数,直到跳到位置n+1。取走的数的和就是你的得分,现在你想知道你可能...

【题解】骨牌铺方格

【题解】骨牌铺方格

【题目描述】有1×n(n<=50)的一个长方形,用一个1×1、1×2和1×3的骨牌铺满方格,请问有多少种铺法?例如当n=3时为1×3的方格。此时用1×1、1×2和1×3的骨牌铺满方格,共有四种铺...

2021年市南区程序设计竞赛(小学组)

1.建设病房(build.cpp)【题目描述】2020年1月23日下午,武汉市建设局紧急召集中建三局等单位举行专题会议,要求参照2003年抗击非典期间北京小汤山医院模式,在武汉职工疗养院建设火神山医院...

【题解】放苹果(2)

【题目描述】把M个同样的苹果放在N个同样的盘子里,不允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。【输入】第一行是测试数据的数目t(0≤t≤20)。以...