http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3957

题意:m个位置,每个位置填1~n的数,求至少有L个位置的数一样的概率(1<=n,m,l<=100)

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. struct inum {
  7. static const int N=205, MOD=10000;
  8. int a[N], len;
  9. inum(int x=0) { len=!x; memset(a, 0, sizeof a); while(x) a[++len]=x%MOD, x/=MOD; }
  10. void fix() { while(len>1 && !a[len]) --len; }
  11. void cln() { memset(a, 0, sizeof(int)*(len+1)); len=1; }
  12. const bool operator<= (const inum &x) {
  13. if(len<x.len) return 1;
  14. if(len>x.len) return 0;
  15. for(int i=len; i; --i)
  16. if(a[i]<x.a[i]) return 1;
  17. else if(a[i]>x.a[i]) return 0;
  18. return 1;
  19. }
  20. inum operator+ (const inum &x) {
  21. static inum ret;
  22. ret.cln();
  23. ret.len=max(len, x.len);
  24. for(int i=1; i<=ret.len; ++i) {
  25. ret.a[i]+=a[i]+x.a[i];
  26. if(ret.a[i]>=MOD) ret.a[i+1]+=ret.a[i]/MOD, ret.a[i]%=MOD;
  27. }
  28. ret.len++;
  29. ret.fix();
  30. return ret;
  31. }
  32. inum operator- (const inum &x) {
  33. static inum ret;
  34. ret.cln();
  35. for(int i=1; i<=len; ++i) {
  36. ret.a[i]+=a[i]-x.a[i];
  37. if(ret.a[i]<0) --ret.a[i+1], ret.a[i]+=MOD;
  38. }
  39. ret.len=len;
  40. ret.fix();
  41. return ret;
  42. }
  43. inum operator* (const inum &x) {
  44. static inum ret;
  45. ret.cln();
  46. for(int i=1; i<=len; ++i)
  47. for(int j=1; j<=x.len; ++j) {
  48. ret.a[i+j-1]+=a[i]*x.a[j];
  49. if(ret.a[i+j-1]>=MOD) ret.a[i+j]+=ret.a[i+j-1]/MOD, ret.a[i+j-1]%=MOD;
  50. }
  51. ret.len=len+x.len;
  52. for(int i=1; i<=ret.len; ++i)
  53. if(ret.a[i]>=MOD) ret.a[i+1]+=ret.a[i]/MOD, ret.a[i]%=MOD;
  54. ret.fix();
  55. return ret;
  56. }
  57. inum div2() {
  58. static inum ret;
  59. ret.cln();
  60. for(int i=len, t=0; i; --i) {
  61. t+=a[i];
  62. ret.a[i]=t>>1;
  63. t=(t&1)*MOD;
  64. }
  65. ret.len=len;
  66. ret.fix();
  67. return ret;
  68. }
  69. inum operator/ (const inum &x) {
  70. static inum l, r, mid, ONE(1);
  71. l=0; r=*this;
  72. while(l<=r) {
  73. mid=(l+r).div2();
  74. if(mid*x<=*this) l=mid+ONE;
  75. else r=mid-ONE;
  76. }
  77. return l-ONE;
  78. }
  79. inum operator% (const inum &x) { return *this-(*this/x)*x; }
  80. static inum gcd(inum a, inum b) { return (b.len==1&&!b.a[1])?a:gcd(b, a%b); }
  81. static inum pow(inum a, int n) {
  82. inum x=1;
  83. while(n) { if(n&1) x=x*a; a=a*a; n>>=1; }
  84. return x;
  85. }
  86. void P() {
  87. printf("%d", a[len]);
  88. for(int i=len-1; i; --i)
  89. printf("%.04d", a[i]);
  90. }
  91. };
  92.  
  93. const int N=105;
  94. inum C[N][N], d[N][N];
  95. int n, m, l;
  96. int main() {
  97. C[0][0]=1;
  98. for(int i=1; i<=100; ++i) {
  99. C[i][0]=1;
  100. for(int j=1; j<=i; ++j)
  101. C[i][j]=C[i-1][j-1]+C[i-1][j];
  102. }
  103. while(~scanf("%d%d%d", &m, &n, &l)) {
  104. if(l>m) { puts("mukyu~"); continue; }
  105. d[0][0]=1; --l;
  106. for(int i=1; i<=n; ++i)
  107. for(int j=1; j<=m; ++j) {
  108. d[i][j]=0; int t=min(j, l);
  109. for(int k=0; k<=t; ++k)
  110. d[i][j]=d[i][j]+d[i-1][j-k]*C[m-(j-k)][k];
  111. }
  112. inum up=0, down=0, gcd;
  113. for(int i=1; i<=n; ++i) up=up+d[i][m];
  114. down=inum::pow(n, m);
  115. up=down-up;
  116. gcd=inum::gcd(up, down);
  117. down=down/gcd;
  118. up=up/gcd;
  119. up.P(); putchar('/'); down.P(); puts("");
  120. }
  121. return 0;
  122. }

  

(麻麻我又码出了一个高精度模板QAQ感觉这一次封包得很好QAQ

(反正超慢QAQ差点就tle了....6000+ms....

首先本题超神!我忘记了补集转化....

求至少L个位置的数一样的方案=总方案数-少于L个位置的数一样的方案数

而后者非常好求...

设$d[i][j]$表示前$i$种数在$m$个位置上填了$j$个的方案数

$$d[i][j]=\sum_{k=0}^{min(j, L-1)} d[i-1][j-k]C[m-(j-k)][k]$$

那么$ans=\frac{n^m-\sum_{i=1}^{n} d[i][m]}{n^m}$

由于输出分数形式...于是上高精度......

【ZOJ】3380 Patchouli's Spell Cards的更多相关文章

  1. zoj 3380 Patchouli's Spell Cards 概率DP

    题意:1-n个位置中,每个位置填一个数,问至少有l个数是相同的概率. 可以转化求最多有l-1个数是相同的. dp[i][j]表示前i个位置填充j个位置的方案数,并且要满足上面的条件. 则: dp[i] ...

  2. ZOJ 3380 Patchouli's Spell Cards

    方案数,$dp$. 总的方案数有$n^m$种,符合要求的直接算不好算,可以算反面,即不符合要求的. 设$dp[i][j]$表示前$i$种等级填了$j$个位置,那么$dp[i][j]=sum(dp[i- ...

  3. 【ZOJ】4012 Your Bridge is under Attack

    [ZOJ]4012 Your Bridge is under Attack 平面上随机n个点,然后给出m条直线,问直线上有几个点 \(n,m \leq 10^{5}\) 由于共线的点不会太多,于是我们 ...

  4. 【ZOJ】【3329】One Person Game

    概率DP/数学期望 kuangbin总结题目中的第三道 看来还是没有进入状态啊……都说是DP了……当然是要找[状态之间的转移关系]了…… 本题中dp[i]跟 dp[i-(k1+k2+k3)] 到dp[ ...

  5. 【有上下界网络流】【ZOJ】2314 Reactor Cooling

    [算法]有上下界网络流-无源汇(循环流) [题解]http://www.cnblogs.com/onioncyc/p/6496532.html //未提交 #include<cstdio> ...

  6. ZOJ-3380 Patchouli’s Spell Cards DP, 组合计数

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3380 题意:有m种不同的元素,每种元素都有n种不同的相位,现在假 ...

  7. 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用

    转载请声明出处:http://www.cnblogs.com/kevince/p/3887827.html    ——By Kevince 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这 ...

  8. 【ZOJ】3740:Water Level【DP】

    Water Level Time Limit: 2 Seconds      Memory Limit: 65536 KB Hangzhou is a beautiful city, especial ...

  9. 【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律

    转自:http://www.cnblogs.com/kevince/p/3887827.html 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这么一说大家心里肯定有数了吧,“不就是nex ...

随机推荐

  1. OS Boot Loader -- 启动器

    这篇文章先抛出来,现在还没有彻底研究明白,但可以做个个人的小结和整理: 记得刚开始搞Linux的时候,普遍采用的是grub,后来有了grub2,尤其是在ubuntu那种非常差劲的不稳定的更新频繁的系统 ...

  2. 几年前做家教写的C教程(之一)

    C语言学习宝典 首先让我们认识什么是C语言. C语言是一种计算机开发语言,是一种非常基础的开发语言.能够用C语言做很多事情.C语言是顺序执行的程序. 程序应该包括数据描述,数据操作. C语言的数据类型 ...

  3. hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. android 入门-android自定义控件

    第一种:继承View 实现自己的属性 <com.cc.imagewithmarkersample.MyView android:id="@+id/myviewid" andr ...

  5. thinkphp调用phpqrcode.php生成二维码

    thinkphp3. 把phpqrcode文件夹放在ThinkPHP\Library\Vendor\下面 phpqrcode下载: http://files.cnblogs.com/files/qho ...

  6. C# 与 Microsoft Expression Encoder实现屏幕录制

    在日常开发中,我们会经常遇到屏幕录制的需求.在C#中可以通过Expression Encoder的SDK实现这样的需求.首先需要下载Expression Encoder SDK,实现代码: priva ...

  7. [Linux] 解压tar.gz文件,解压部分文件

    遇到数据库无法查找问题原因,只能找日志,查找日志的时候发现老的日志都被压缩了,只能尝试解压了   数据量比较大,只能在生产解压了,再进行查找 文件名为*.tar.gz,自己博客以前记录过解压方法: h ...

  8. ortp库入门

    转自:http://blog.csdn.net/suer0101/article/details/7333267 再补充一个代码走读:http://www.xuebuyuan.com/1863409. ...

  9. [Liferay6.2]Liferay Dynamic Query API示例

    介绍 Liferay提供了几种方法定义复杂的查询用来检索数据库中的数据. 通常情况下,在每个service Entity中,通过定义一些'finder'方法,可以便捷地满足基本的数据查询操作. 但是, ...

  10. snakeyaml - Documentation.wiki

    SnakeYAML Documentation This documentation is very brief and incomplete. Feel free to fix or improve ...