|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
复制代码
|
|