/*
* @Description: To iterate is human, to recurse divine.
* @Autor: Recursion
* @Date: 2022-03-14 11:01:59
* @LastEditTime: 2022-03-14 12:47:37
*/
#include<bits/stdc++.h>
using namespace std;
int a[(int)1e6+10];
bool b[(int)1e6+10];
int ans;
int cnt;
int k,n;
int Prime[(int)1e6+10];
bool isPrime[(int)1e6+10];
void GetPrime(int x)
{
memset(isPrime,1,sizeof(isPrime));
isPrime[1]=0;
for(int i=2;i<=x;i++){
if(isPrime[i])
Prime[++cnt]=i;
for(int j=1;j<=cnt&&i*Prime[j]<=x;j++){
isPrime[i*Prime[j]]=0;
if(i%Prime[j]==0)
break;
}
}
}
void dfs(int x,int sum,int startx)
{
if(x==k){
//cout<<sum<<endl;
for(int i=1;i<=cnt;i++){
if(Prime[i]==sum){
ans++;
break;
}
}
return;
}
for(int t=startx;t<=n;t++){
dfs(x+1,sum+a[t],t+1);
}
return;
}
int main()
{
cin>>n>>k;
GetPrime((int)1e6+10);
// for(int i=1;i<=30;i++)
// cout<<Prime[i]<<endl;
for(int i=1;i<=n;i++)
cin>>a[i];
dfs(0,0,1);
cout<<ans<<endl;
}
P1036 [NOIP2002 普及组] 选数
最新推荐文章于 2024-11-08 09:23:57 发布
这篇文章介绍了如何使用C++解决NOIP2002普及组中涉及的选数问题,通过递归方法遍历组合,并利用GetPrime函数计算指定范围内素数,计数满足条件的组合。
1143

被折叠的 条评论
为什么被折叠?



