鱼C论坛

 找回密码
 立即注册
查看: 1817|回复: 5

[已解决]洛谷p1036 选数

[复制链接]
发表于 2022-7-11 09:57:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-7-12 11:46 编辑

应该先把奇偶分类
然后奇数选择奇数个,偶数=k-选择奇数的个数
然后再判断和是否为素数(判断时枚举的因子应该都是奇数)
  1. typedef struct GETSUSU
  2. {
  3.     int *num,*jisu,*ousu,*numk;
  4.     int ncount,jisucount,ousucount,k;

  5.     int jisuseek,oususeek,jisuselect,tongjicount;


  6. }GSS,*pGSS;
  7. int ousu(pGSS pgss,int n)
  8. {
  9.     if(0==n)
  10.     {
  11.         for(int i=0;i<pgss->k;i++)
  12.         {
  13.             printf("%4d",pgss->numk[i]);
  14.         }
  15.         printf("\n");
  16.         pgss->tongjicount+=1;
  17.         return 1;
  18.     }
  19.     for(int i=pgss->oususeek;i<=pgss->ousucount-n;i++)
  20.     {
  21.         pgss->numk[pgss->jisuselect+n-1]=pgss->ousu[i];
  22.         pgss->oususeek=i+1;
  23.         ousu(pgss,n-1);
  24.         pgss->oususeek=i;
  25.     }
  26.     return 0;
  27. }
  28. int jisu(pGSS pgss,int n)
  29. {
  30.     if(0==n)
  31.     {
  32.         pgss->oususeek=0;
  33.         ousu(pgss,pgss->k-pgss->jisuselect);
  34.         return 1;
  35.     }
  36.     for(int i=pgss->jisuseek;i<=pgss->jisucount-n;i++)
  37.     {
  38.         pgss->numk[n-1]=pgss->jisu[i];
  39.         pgss->jisuseek=i+1;
  40.         jisu(pgss,n-1);
  41.         pgss->jisuseek=i;
  42.     }
  43.     return 0;
  44. }
  45. int combination(int a,int b)
  46. {
  47.     int sum1=1,sum2=1;
  48.     for(int i=a;i>a-b;i--)sum1*=i;
  49.     for(int i=1;i<=b;i++)sum2*=i;
  50.     return sum1/sum2;

  51. }
  52. int main()
  53. {
  54.     GSS gss;
  55.     int n=0,k=0,i=0,j=0,t=0;
  56.     scanf("%d%d",&n,&k);
  57.     gss.k=k;
  58.     gss.ncount=n;
  59.     gss.num=(int*)calloc(n,sizeof(int));
  60.     gss.numk=(int*)calloc(k,sizeof(int));
  61.     gss.jisuseek=gss.oususeek=0;
  62.     for(i=0,j=n-1;i<j+1;)
  63.     {
  64.         scanf("%d",&t);
  65.         if(t%2)gss.num[i++]=t;
  66.         else
  67.             gss.num[j--]=t;
  68.     }
  69.     gss.jisucount=i,gss.ousucount=n-i;
  70.     gss.jisu=gss.num,gss.ousu=gss.num+i;
  71.     for(i=0;i<n;i++)printf("%4d",gss.num[i]);
  72.     printf("\n");
  73.     gss.tongjicount=0;
  74.     int sum=0;
  75.     for(i=1;i<=gss.jisucount;i+=2)
  76.     {
  77.         sum+=combination(gss.jisucount,i)*combination(gss.ousucount,k-i);
  78.         gss.jisuseek=gss.oususeek=0;
  79.         gss.jisuselect=i;
  80.         jisu(&gss,i);
  81.     }

  82.     printf("\n%d",gss.tongjicount);
  83.     printf("\n%d",sum);
  84.     free(gss.numk);
  85.     free(gss.num);

  86.     return 0;
  87. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-15 03:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表