#include"stdio.h"
#include"stdlib.h"
#include"iostream"
#include"string.h"
#include"map"
using namespace std;
typedef long long ll;
ll mod(ll a,ll b,ll c)
{
if(!b) return 1;
return mod(a*a%c,b/2,c)*((b&1)?a:1)%c;
}
bool MR(ll x)
{
if(x==2) return true;
for(int i=1;i<=50;i++){
ll a=rand()%(x-2)+2;
if(mod(a,x-1,x)!=1)
return false;
}
return true;
}
int ans,n,k;
int a[40];
int visit[50];
void dfs(int pos,int num,int dep)
{
visit[pos]=1;
if(dep==k)
{
if(MR(num)) {ans++;}
return;
}
for(int i=pos+1;i<n;i++)
if(!visit[i])
{
dfs(i,num+a[i],dep+1); //dfs之后记得把标志更改回来
visit[i]=0;
}
return;
}
int main()
{
while(cin>>n>>k) //不要去重只要组合起来三个是素数就行
{
cnt.clear();
ans=0;
for(int i=0;i<n;i++)
cin>>a[i];
memset(visit,0,sizeof(visit));
for(int i=0;i<n-k+1;i++)
{
if(!visit[i])
{
dfs(i,a[i],1);
visit[i]=0;
}
}
cout<<ans<<endl;
}
}
VIJOS 1128 DFS+MR 判素数
最新推荐文章于 2020-11-04 18:20:11 发布