记录编号 496240 评测结果 AAAAAAAAAA
题目名称 放棋子 最终得分 100
用户昵称 Gravatar-1 是否通过 通过
代码语言 C++ 运行时间 0.013 s
提交时间 2018-05-02 00:24:28 内存使用 0.65 MiB
显示代码纯文本
  1. #define _CRT_SECURE_NO_DEPRECATE
  2. /************************
  3. *创建时间:2018 05 02
  4. *文件类型:源代码文件
  5. *题目来源:COGS
  6. *当前状态:已通过
  7. *备忘录:状态压缩 动态规划
  8. *作者:HtBest
  9. ************************/
  10. #include <stdio.h>
  11. #include <iostream>
  12. #include <string>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <algorithm>
  16. using namespace std;
  17. int n,m,p,way[1100],_way;
  18. long long f[2][1<<10][21];
  19. /* Variable explain:
  20.  
  21. */
  22. bool check(int x)
  23. {
  24. bool flag=0;
  25. while(x)
  26. {
  27. if(x&1)
  28. {
  29. if(flag)return false;
  30. flag=1;
  31. }
  32. else flag=0;
  33. x>>=1;
  34. }
  35. return true;
  36. }
  37. bool check(int x,int y){return !(x&y);}
  38. void read()
  39. {
  40. freopen("examtwo.in","r",stdin);
  41. freopen("examtwo.out","w",stdout);
  42. scanf("%d%d%d",&n,&m,&p);
  43. if(n>m)swap(n,m);
  44. for(int i=0;i<(1<<n);++i) if(check(i))way[++_way]=i;
  45. // for(int i=1;i<=_way;++i) printf("%d\n",way[i]);
  46. return;
  47. }
  48. int num(int x)
  49. {
  50. int ans=0;
  51. while(x)
  52. {
  53. ans+=x&1;
  54. x>>=1;
  55. }
  56. return ans;
  57. }
  58. long long dp()
  59. {
  60. int t=1;
  61. long long ans=0;
  62. for(int i=1;i<=_way;++i)
  63. f[0][way[i]][num(way[i])]=1;
  64. for(int T=1;T<m;++T)
  65. {
  66. for(int i=1;i<=_way;++i)
  67. {
  68. for(int j=1;j<=_way;++j)
  69. {
  70. if(!check(way[i],way[j]))continue;
  71. for(int k=num(way[i]);k<=p;++k)
  72. f[t][way[i]][k]+=f[t^1][way[j]][k-num(way[i])];
  73. }
  74. }
  75. t^=1;
  76. memset(f[t],0,sizeof(f[t]));
  77. }
  78. t^=1;
  79. for(int i=1;i<=_way;++i)
  80. ans+=f[t][way[i]][p];
  81. return ans;
  82. }
  83. long long gcd(int a,int b){return !b?a:gcd(b,a%b);}
  84. long long C(int a,int b)
  85. {
  86. long long c=1;
  87. for(int i=1;i<=b;++i)
  88. c=c*(a-i+1)/i;
  89. return c;
  90. }
  91. int main()
  92. {
  93. read();
  94. long long a=dp(),b=C(n*m,p),c=gcd(a,b);
  95. printf("%lld/%lld",b/c,a/c);
  96. return 0;
  97. }