洛谷P1036选数题解--zhengjun

Yolanda ·
更新时间:2024-11-14
· 781 次阅读

题目描述

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

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

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

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

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

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

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

输入格式

键盘输入,格式为:

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

x1,x2,…,xnx_1,x_2,…,x_nx1​,x2​,…,xn​ (1≤xi≤50000001 \le x_i \le 50000001≤xi​≤5000000)

输出格式

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

输入输出样例 输入 #1 复制 4 3 3 7 12 19 输出 #1 复制 1 思路

反正就是枚举所有可能的情况,再判断是否是素数就可以了。

代码dfs #include using namespace std; int n,m; int a[21]; int ans; int check(int x){ int y=sqrt(x); for(int i=2;i<=y;i++) if(x%i==0) return 0; return 1; } void dfs(int k,int sum,int head){ if(k==m){ ans+=check(sum); return; } for(int i=head;i<=n;i++) dfs(k+1,sum+a[i],i+1); } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)scanf("%d",&a[i]); dfs(0,0,1); printf("%d",ans); return 0; }

多简单

谢谢–zhengjun
作者:A_zjzj



p1

需要 登录 后方可回复, 如果你还没有账号请 注册新账号