CSDN 高校俱乐部/英雄会 题目;

设数组a包含n个元素恰好是0..n - 1的一个排列,给定b[0],b[1],b[2],b[3]问有多少个0..n-1的排列a,满足(a[a[b[0]]]*b[0]+a[a[b[1]]]*b[1]+a[a[b[2]]]*b[2]+a[a[b[3]]]*b[3])%n==k ?

输入包含5个参数:N,K,B0,B1,B2,B3,其中 4<= N<12, 0 <= K,B0,B1,B2,B3 < N

单全排列超时代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. int b[5];
  4. int c[5];
  5. int a[15];
  6. int aa[15];
  7. int vis[15];
  8. int n, sum, k;
  9.  
  10. int B_same_num(int b[]){
  11. int i, j;
  12. int p = 4;
  13. for(i=0;i<3;++i){
  14. if(b[i] == -1) continue;
  15. for(j=i+1;j<4;++j)
  16. if(b[i] == b[j]){
  17. b[j] = -1;
  18. --p;
  19. }
  20. }
  21. return p;
  22. }
  23.  
  24. void reset(int b[]){
  25. int i, j;
  26. for(i=j=0; j < 4; ++j){
  27. if(b[j] != -1)
  28. c[i++] = b[j];
  29. }
  30. }
  31.  
  32. void dfs(int s, int num) {
  33. int i;
  34. if(s == n) {
  35. if(4 == num)
  36. if( (c[0]*a[a[0]] + c[1]*a[a[1]] + c[2]*a[a[2]] + c[3]*a[a[3]])%n == k )
  37. ++sum;
  38. if(3 == num)
  39. if( (c[0]*a[0] + c[1]*a[1] + 2 * c[2]*a[2])%n == k )
  40. ++sum;
  41. if(2 == num)
  42. if( (c[0]*a[0] + 3 * c[1]*a[1])%n == k )
  43. ++sum;
  44. if(1 == num)
  45. if( (4 * c[0]*a[0])%n == k )
  46. ++sum;
  47.  
  48. return;
  49. }
  50. for(i = 0; i < n; i++) {
  51. if(vis[i]) continue;
  52. vis[i] = 1;
  53. a[s] = i;
  54. dfs(s+1, num);
  55. vis[i] = 0;
  56. }
  57. }
  58.  
  59. int main(int argc, char const *argv[])
  60. {
  61. int t, i;
  62. scanf("%d", &t);
  63. while(t--){
  64. sum = 0;
  65. scanf("%d %d", &n, &k);
  66. for(i=0;i<4;++i)
  67. scanf("%d", &b[i]);
  68. int num = B_same_num(b);
  69. reset(b);
  70. dfs(0, num);
  71. printf("%d\n", sum);
  72. }
  73. return 0;
  74. }

  

双全排列改进后AC的代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. int b[5];
  4. int c[5];
  5. int a[15];
  6. int d[15];
  7. int sui[15];
  8. int vis[15];
  9. int vis1[15];
  10. int arr[15];
  11. int jiecheng[20];
  12. int n, sum, k;
  13.  
  14. void _jiecheng(){
  15. jiecheng[0] =1;
  16. jiecheng[1] =1;
  17. jiecheng[2] =2;
  18. jiecheng[3] =6;
  19. jiecheng[4] =24;
  20. jiecheng[5] =120;
  21. jiecheng[6] =720;
  22. jiecheng[7] =5040;
  23. jiecheng[8] =40320;
  24. jiecheng[9] =362880;
  25. jiecheng[10] =3628800;
  26. jiecheng[11] =39916800;
  27. jiecheng[12] =479001600;
  28. }
  29.  
  30. void init(){
  31. int i;
  32. for(i=0;i<15;++i) arr[i] = 0;
  33. }
  34.  
  35. int B_same_num(int b[]){
  36. int i, j;
  37. int p = 4;
  38. for(i=0;i<3;++i){
  39. if(b[i] == -1) continue;
  40. for(j=i+1;j<4;++j)
  41. if(b[i] == b[j]){
  42. b[j] = -1;
  43. --p;
  44. }
  45. }
  46. return p;
  47. }
  48.  
  49. void reset(int b[]){
  50. int i, j;
  51. for(i=j=0; j < 4; ++j){
  52. if(b[j] != -1)
  53. c[i++] = b[j];
  54. }
  55. }
  56.  
  57. void suiji(int s, int num, int b_num) {
  58. int i, j;
  59. int dd;
  60. dd = n - num - b_num;
  61.  
  62. if(s == num) {
  63. j=0;
  64. for(i = 0; i < b_num; i++){
  65. if(arr[a[c[i]]] == 1) continue;
  66. else {
  67. a[a[c[i]]] = sui[j++];
  68. }
  69. }
  70. if(4 == b_num){
  71. if( (c[0]*a[a[c[0]]] + c[1]*a[a[c[1]]] + c[2]*a[a[c[2]]] + c[3]*a[a[c[3]]])%n == k ){
  72. sum+=jiecheng[dd];
  73. }
  74. }
  75. if(3 == b_num)
  76. if( (c[0]*a[a[c[0]]] + c[1]*a[a[c[1]]] + 2 * c[2]*a[a[c[2]]])%n == k )
  77. sum+=jiecheng[dd];
  78. if(2 == b_num)
  79. if( (c[0]*a[a[c[0]]] + 3 * c[1]*a[a[c[1]]])%n == k )
  80. sum+=jiecheng[dd];
  81. if(1 == b_num)
  82. if( (4 * c[0]*a[a[c[0]]])%n == k )
  83. sum+=jiecheng[dd];
  84. return;
  85. }
  86. for(i = 0; i < n; i++) {
  87. if(vis1[i]) continue;
  88. if(vis[i]) continue;
  89. vis1[i] = 1;
  90. sui[s] = i;
  91. // printf("sui : %d\n", sui[s]);
  92. suiji(s+1, num, b_num);
  93. vis1[i] = 0;
  94. }
  95. }
  96.  
  97. int arr_num(int num){
  98. int dd = 0;
  99. int i;
  100. for(i=0;i<num;++i)
  101. if(arr[a[c[i]]] == 1) continue;
  102. else ++dd;
  103. return dd;
  104. }
  105.  
  106. void dfs(int s, int num) {
  107. int i, t;
  108. if(s == num) {
  109. init();
  110. for(i=0;i<num;++i){
  111. a[c[i]] = d[i];
  112. arr[c[i]] = 1;
  113. }
  114. t = arr_num(num);
  115. suiji(0, t, num);
  116. return;
  117. }
  118. for(i = 0; i < n; i++) {
  119. if(vis[i]) continue;
  120. vis[i] = 1;
  121. d[s] = i;
  122. dfs(s+1, num);
  123. vis[i] = 0;
  124. }
  125. }
  126.  
  127. int main(int argc, char const *argv[])
  128. {
  129. int t, i;
  130. scanf("%d", &t);
  131. while(t--){
  132. sum = 0;
  133. _jiecheng();
  134. scanf("%d %d", &n, &k);
  135. for(i=0;i<4;++i)
  136. scanf("%d", &b[i]);
  137. int num = B_same_num(b);
  138. reset(b);
  139. dfs(0, num);
  140. printf("%d\n", sum);
  141. }
  142. return 0;
  143. }

  

精简版 代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int a[12];
  5. int b[4];
  6. int N, K, ans;
  7. int v[12];
  8. int fac[14];
  9.  
  10. void factorial(){
  11. int i;
  12. fac[0] = 1;
  13. for(i=1;i<=12;++i)
  14. fac[i] = fac[i-1]*i;
  15. }
  16.  
  17. void dfs2(int s){
  18. int t;
  19. if(s == 4){
  20. if ((a[a[b[0]]]*b[0]+a[a[b[1]]]*b[1]+a[a[b[2]]]*b[2]+a[a[b[3]]]*b[3])%N==K){
  21. t = 0;
  22. int i;
  23. for(i=0;i<N;++i)
  24. if(a[i] == -1) ++t;
  25. ans += fac[t];
  26. }
  27. return;
  28. }
  29. if(a[a[b[s]]] != -1)
  30. dfs2(s+1);
  31. else{
  32. int i;
  33. for(i=0;i<N;++i)
  34. if(!v[i]){
  35. v[i] = 1;
  36. a[a[b[s]]] = i;
  37. dfs2(s+1);
  38. v[i] = 0;
  39. a[a[b[s]]] = -1;
  40. }
  41. }
  42. }
  43.  
  44. void dfs(int s){
  45. int i;
  46. if(s == 4){
  47. dfs2(0);
  48. return;
  49. }
  50. if(a[b[s]] != -1)
  51. dfs(s+1);
  52. else{
  53. for(i=0;i<N;++i)
  54. if(!v[i]){
  55. v[i] = 1;
  56. a[b[s]] = i;
  57. dfs(s+1);
  58. v[i] = 0;
  59. a[b[s]] = -1;
  60. }
  61. }
  62. }
  63.  
  64. int main(int argc, char const *argv[])
  65. {
  66. int i;
  67. scanf("%d%d%d%d%d%d", &N, &K, &b[0], &b[1], &b[2], &b[3]);
  68. ans = 0;
  69. memset(v, 0, sizeof(v));
  70. for(i=0;i<12;++i) a[i] = -1;
  71. factorial();
  72. dfs(0);
  73. printf("%d\n", ans);
  74. return 0;
  75. }

  

  

测试数据 :

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int howmany (int N,int K,int B0,int B1,int B2,int B3)
  5. {
  6. if(N==4 && K==0 && B0==3 && B1==2 &&B2==1 &&B3==0) return 4;
  7. if(N==5 && K==2 && B0==1 && B1==2 &&B2==3 &&B3==4) return 40;
  8. if(N==6 && K==4 && B0==5 && B1==4 &&B2==3 &&B3==2) return 78;
  9. if(N==7 && K==6 && B0==6 && B1==4 &&B2==2 &&B3==0) return 684;
  10. if(N==8 && K==1 && B0==0 && B1==1 &&B2==2 &&B3==3) return 5454;
  11. if(N==9 && K==3 && B0==4 && B1==8 &&B2==1 &&B3==2) return 44028;
  12. if(N==10 && K==5 && B0==3 && B1==7 &&B2==9 &&B3==0) return 349776;
  13. if(N==11 && K==7 && B0==3 && B1==1 &&B2==8 &&B3==9) return 3651984;
  14. if(N==11 && K==0 && B0==0 && B1==0 &&B2==0 &&B3==0) return 39916800;
  15. if(N==11 && K==5 && B0==4 && B1==3 &&B2==2 &&B3==1) return 3662976;
  16. return 0;
  17. }

  

PS :  和别人的代码根本无法媲美。。以后在重新改进一下这份代码!

CSDN 高校俱乐部: 排列搜索的更多相关文章

  1. CSDN高校俱乐部2013年秋季北京地区第一站“编程语言的应用及其发展”—北京联合大学

    2013年12月11日晚17:00.CSDN高校俱乐2013年秋季北京地区第一站“编程语言的应用及其发展”在北京联合大学进行. 首先,CSDN总部人员介绍CSDN俱乐部的改版以及线上编程挑战赛.CSD ...

  2. 朋友的礼物(英雄会,csdn,高校俱乐部)信封问题,匹配模型

    前言: 首先这是一题解,但是重点最代码之后,有耐心的可以直接从代码后看. 上题目:n个人,每个人都有一件礼物想送给他人,他们决定把礼物混在一起,然后每个人随机拿走一件,问恰好有m个人拿到的礼物恰好是自 ...

  3. P次方数 英雄会 csdn 高校俱乐部

    题目: 一个整数N,|N| >= 2, 如果存在整数x,使得N = x * x * x... (p个x相乘) =x^p,则称N是p次方数,给定32位内的整数N,求最大的P.例如N=5,输出1,N ...

  4. (csdn高校俱乐部编程挑战)2的补码

    题目详情 在计算机中,整数是以2的补码的形式给出的. 给出整数A和B,如果计算机是32位机.求从A到B之间的全部二进制数中,一共用了多少个1. 输入格式: 多组数据,每组数据一行,由两个整数A,B, ...

  5. CSDN高校俱乐部第二届战神杯第二题题解

    两个人玩一个数字游戏,给定两个正整数A,B,两个人轮流从一个数中减去另外一个数的正数倍.要保证结果非负, 首先得到0的人获胜. 比如:30 8经过一步操作能够变为22 8 或者14 8 或者 6 8. ...

  6. N的N次方(高校俱乐部)

    最近一直在刷字符串和线段树,也越来越少玩高校俱乐部,无聊看到一题N的N次方的问题,脑海中各种打表就涌现出来了. 弄了不一会儿,就写完了,马上提交,但是系统好像出了问题,提示"哦哦,出了点状况 ...

  7. CSDN的博客搜索功能不又给力了呵呵呵呵

    不得不说,CSDN博客的搜索功能是在太弱了.而且一直都很弱,以至于我每次想在自己博客上找自己发的文章都变得那么难.做一个搜索博客内文章的功能没有那么难吧? 还是说CSDN已经放弃了博客这一块了? 我发 ...

  8. 翻纸牌 高校俱乐部 英雄会 csdn

    题目描述 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者 ...

  9. 半质数的个数 csdn 英雄会 高校俱乐部

    2·14 情人&元宵节专题:半质数的个数. 题目:质数是大家熟知的概念,我们定义一个半质数的概念:如果一个数恰好是两个质数的乘积(可以相同),则称它为半质数.前几个半质数是 4, 6, 9, ...

随机推荐

  1. 每天进步一点点--&gt;功能fseek() 使用方法

    在阅读代码时,遇到了非常早之前用过的fseek(),非常久没实用了.有点陌生,写出来以便下次查阅. 函数功能是把文件指针指向文件的开头.须要包括头文件stdio.h fseek   函数名: fsee ...

  2. UI測试内容

    我们在实际工作其中,针对web应用程序,也就是常常所说的B/S系统,能够从例如以下方面来进行用户界面測试: 导航測试 导航描写叙述了用户在一个页面内操作的方式,在不同的用户接口控制之间,比如butto ...

  3. Util

    Util最新代码更新说明   离上一篇又过去了一个月,时间比较紧,后续估计会更紧,所以这次将放出更多公共操作类及配套的CodeSmith模板,本篇将简要介绍新放出的重要功能,供有兴趣的同学参考. 重要 ...

  4. lua学习笔记10:lua简单的命令行

    前面反复使用的命令行,好学喜欢命令行: 一 格公式 lua [options][script][args] 两 详细命令 -e 直接命令传递一个lua -l 加载文件 -i 进入交互模式 比例如.端子 ...

  5. DevExpress中获取RichTextEdit中RichEditControl的两种方式

    方式一: var rte = sender as RichTextEdit; control = rte.Controls[] as RichEditControl; 方式二: PropertyInf ...

  6. Roundabout for jQuery

    效果图: Roundabout是一个转换静态HTML元素结构为交互式播放区域的jQuery插件(而且并不仅仅是一个转盘,还有许多的形状) 首先你要下载好Jquery.min.js,和Jquery-Ro ...

  7. C语言学习之路,第一篇章。

    看的书是 C  primer plus  ,这本书好评很多, 学过C#,没有精通,了解Java,所以看这本书会很容易上手,编译器用的是VC++6.0,因为VS2010好像不支持C99标准,有些代码功能 ...

  8. AngularJS之使用服务封装

    AngularJS之使用服务封装可复用代码   创建服务组件 在AngularJS中创建一个服务组件很简单,只需要定义一个具有$get方法的构造函数, 然后使用模块的provider方法进行登记: / ...

  9. python解析命令行

    可以解析这样的命令 ./cron_ctrl jobname1 --stop ;./cron_ctrl jobname1 --start;./cron_ctrl jobname1 --list #!/u ...

  10. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...