P1036 [NOIP 2002 普及组] 选数(洛谷题面)
题目
题目描述:
已知 n 个整数 x1,x2,⋯,xn,以及 1 个整数 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≤5×106)。
输出格式:
输出一个整数,表示种类数。
数据范围与说明:
【题目来源】
NOIP 2002 普及组第二题
输入输出样例 #1
输入:
输出:
题意
简述:
已知 n 个整数 x1,x2,⋯,xn,以及 1 个整数 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。
代码
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #include<bits/stdc++.h> using namespace std; typedef long long ll; ll n,a[25],k,ans=0,sum[25]; bool check(ll x){ if(x==1) return false; for(ll i=2;i<x;i++){ if(x%i==0) return false; } return true; }
void solve(ll total,ll pos,ll start){ if(pos==k){ if(check(total)){ ans++; } return ; } for(int i=start;i<n;i++){ solve(total+a[i],pos+1,i+1); } return ; }
int main(){ cin>>n>>k; for(int i=0;i<n;i++){ cin>>a[i]; } solve(0,0,0); cout<<ans; return 0; }
|