|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
只a了一个点,找了好久,结果改了之后总是全错。
#include<bits/stdc++.h>
using namespace std;
int k,n,ans;
int a[20],b[100];
bool pr[312501];
void pro(){
for(int i=2;i<177;i++){
if(i%2==1||i==2){
for(int j=i*i;j<=312500;j+=2){
if((j%i==0||pr[j])){
pr[j]=true;
}
}
}
else{
for(int j=i*i+1;j<=312500;j+=2){
if(j%i==0||pr[j]){
pr[j]=true;
}
}
}
}
}
// int cc(int ns){
// for(int i=0;i<ans;i++){
// if(ns==b[i]){
// return 0;
// }
// }
// b[ans]=ns;
// return 1;
// }
void z(int i,int an,int step){
if(step==k){
//cout<<an+a[i]<<endl;
if(!pr[an+a[i]]){
//ans+=cc(an+a[i]);
cout<<an+a[i]<<endl;
ans++;
}
}
else{
for(int l=i;l<=n;l++){
z(l+1,an+a[i],step++);
}
}
}
int main(){
pro();
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>a[i];
}
int o=0;
for(int i=0;i<n-k;i++){
z(i,0,1);
}
cout<<ans;
return 0;
}
本帖最后由 jhq999 于 2022-7-12 11:46 编辑
应该先把奇偶分类
然后奇数选择奇数个,偶数=k-选择奇数的个数
然后再判断和是否为素数(判断时枚举的因子应该都是奇数) typedef struct GETSUSU
{
int *num,*jisu,*ousu,*numk;
int ncount,jisucount,ousucount,k;
int jisuseek,oususeek,jisuselect,tongjicount;
}GSS,*pGSS;
int ousu(pGSS pgss,int n)
{
if(0==n)
{
for(int i=0;i<pgss->k;i++)
{
printf("%4d",pgss->numk[i]);
}
printf("\n");
pgss->tongjicount+=1;
return 1;
}
for(int i=pgss->oususeek;i<=pgss->ousucount-n;i++)
{
pgss->numk[pgss->jisuselect+n-1]=pgss->ousu[i];
pgss->oususeek=i+1;
ousu(pgss,n-1);
pgss->oususeek=i;
}
return 0;
}
int jisu(pGSS pgss,int n)
{
if(0==n)
{
pgss->oususeek=0;
ousu(pgss,pgss->k-pgss->jisuselect);
return 1;
}
for(int i=pgss->jisuseek;i<=pgss->jisucount-n;i++)
{
pgss->numk[n-1]=pgss->jisu[i];
pgss->jisuseek=i+1;
jisu(pgss,n-1);
pgss->jisuseek=i;
}
return 0;
}
int combination(int a,int b)
{
int sum1=1,sum2=1;
for(int i=a;i>a-b;i--)sum1*=i;
for(int i=1;i<=b;i++)sum2*=i;
return sum1/sum2;
}
int main()
{
GSS gss;
int n=0,k=0,i=0,j=0,t=0;
scanf("%d%d",&n,&k);
gss.k=k;
gss.ncount=n;
gss.num=(int*)calloc(n,sizeof(int));
gss.numk=(int*)calloc(k,sizeof(int));
gss.jisuseek=gss.oususeek=0;
for(i=0,j=n-1;i<j+1;)
{
scanf("%d",&t);
if(t%2)gss.num[i++]=t;
else
gss.num[j--]=t;
}
gss.jisucount=i,gss.ousucount=n-i;
gss.jisu=gss.num,gss.ousu=gss.num+i;
for(i=0;i<n;i++)printf("%4d",gss.num[i]);
printf("\n");
gss.tongjicount=0;
int sum=0;
for(i=1;i<=gss.jisucount;i+=2)
{
sum+=combination(gss.jisucount,i)*combination(gss.ousucount,k-i);
gss.jisuseek=gss.oususeek=0;
gss.jisuselect=i;
jisu(&gss,i);
}
printf("\n%d",gss.tongjicount);
printf("\n%d",sum);
free(gss.numk);
free(gss.num);
return 0;
}
|
|