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

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

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;struct inum {static const int N=205, MOD=10000;int a[N], len;inum(int x=0) { len=!x; memset(a, 0, sizeof a); while(x) a[++len]=x%MOD, x/=MOD; }void fix() { while(len>1 && !a[len]) --len; }void cln() { memset(a, 0, sizeof(int)*(len+1)); len=1; }const bool operator<= (const inum &x) {if(len<x.len) return 1;if(len>x.len) return 0;for(int i=len; i; --i)if(a[i]<x.a[i]) return 1;else if(a[i]>x.a[i]) return 0;return 1;}inum operator+ (const inum &x) {static inum ret;ret.cln();ret.len=max(len, x.len);for(int i=1; i<=ret.len; ++i) {ret.a[i]+=a[i]+x.a[i];if(ret.a[i]>=MOD) ret.a[i+1]+=ret.a[i]/MOD, ret.a[i]%=MOD;}ret.len++;ret.fix();return ret;}inum operator- (const inum &x) {static inum ret;ret.cln();for(int i=1; i<=len; ++i) {ret.a[i]+=a[i]-x.a[i];if(ret.a[i]<0) --ret.a[i+1], ret.a[i]+=MOD;}ret.len=len;ret.fix();return ret;}inum operator* (const inum &x) {static inum ret;ret.cln();for(int i=1; i<=len; ++i)for(int j=1; j<=x.len; ++j) {ret.a[i+j-1]+=a[i]*x.a[j];if(ret.a[i+j-1]>=MOD) ret.a[i+j]+=ret.a[i+j-1]/MOD, ret.a[i+j-1]%=MOD;}ret.len=len+x.len;for(int i=1; i<=ret.len; ++i)if(ret.a[i]>=MOD) ret.a[i+1]+=ret.a[i]/MOD, ret.a[i]%=MOD;ret.fix();return ret;}inum div2() {static inum ret;ret.cln();for(int i=len, t=0; i; --i) {t+=a[i];ret.a[i]=t>>1;t=(t&1)*MOD;}ret.len=len;ret.fix();return ret;}inum operator/ (const inum &x) {static inum l, r, mid, ONE(1);l=0; r=*this;while(l<=r) {mid=(l+r).div2();if(mid*x<=*this) l=mid+ONE;else r=mid-ONE;}return l-ONE;}inum operator% (const inum &x) { return *this-(*this/x)*x; }static inum gcd(inum a, inum b) { return (b.len==1&&!b.a[1])?a:gcd(b, a%b); }static inum pow(inum a, int n) {inum x=1;while(n) { if(n&1) x=x*a; a=a*a; n>>=1; }return x;}void P() {printf("%d", a[len]);for(int i=len-1; i; --i)printf("%.04d", a[i]);}
};const int N=105;
inum C[N][N], d[N][N];
int n, m, l;
int main() {C[0][0]=1;for(int i=1; i<=100; ++i) {C[i][0]=1;for(int j=1; j<=i; ++j)C[i][j]=C[i-1][j-1]+C[i-1][j];}while(~scanf("%d%d%d", &m, &n, &l)) {if(l>m) { puts("mukyu~"); continue; }d[0][0]=1; --l;for(int i=1; i<=n; ++i)for(int j=1; j<=m; ++j) {d[i][j]=0; int t=min(j, l);for(int k=0; k<=t; ++k)d[i][j]=d[i][j]+d[i-1][j-k]*C[m-(j-k)][k];}inum up=0, down=0, gcd;for(int i=1; i<=n; ++i) up=up+d[i][m];down=inum::pow(n, m);up=down-up;gcd=inum::gcd(up, down);down=down/gcd;up=up/gcd;up.P(); putchar('/'); down.P(); puts("");}return 0;
}

  

(麻麻我又码出了一个高精度模板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)

    Patchouli's Spell Cards Time Limit: 7 Seconds      Memory Limit: 65536 KB Patchouli Knowledge, the u ...

  2. ★ZOJ 3380 Patchouli's Spell Cards 详细题解 (递推+组合数求方案数)

    Patchouli's Spell Cards Time Limit: 7 Seconds      Memory Limit: 65536 KB Patchouli Knowledge, the u ...

  3. ZOJ 3380 Patchouli's Spell Cards [基础概率DP+大数]

    Patchouli's Spell Cards Time Limit: 7 Seconds      Memory Limit: 65536 KB Patchouli Knowledge, the u ...

  4. ZOJ 3380 Patchouli's Spell Cards [基础DP+大数]

    Description Patchouli Knowledge, the unmoving great library, is a magician who has settled down in t ...

  5. 【概率DP】 ZOJ 3380 Patchouli's Spell Cards

    通道 题意:有m个位置,每个位置填入一个数,数的范围是1~n,问至少有L个位置的数一样的概率 思路: 总数是n^m,我们求没有L个位置一样的数的概率* 设 dp[i][j]表示用前i个数,填充j个位置 ...

  6. ZOJ 3380 Patchouli's Spell Cards(概率+大数)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3957 题意:m个位置,每个位置可以放n种数字(1-n).问至少有L个 ...

  7. ZOJ 3380 Patchouli's Spell Cards( 概率DP)

    题意:用n个数填充m个位置,问有大于等于l个相同数字的概率. 这个题看了很多题解,大部分代码都是有点问题的,一开始dp的状态都是一样的.(具体见下) 思路:设dp[i][j] 为用前i个数填充j个位置 ...

  8. ZOJ 3380 Patchouli's Spell Cards

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

  9. ZOJ 3380 Patchouli's Spell Cards(DP,大数)

    转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove 题目:有m个位置,每个位置填入一 ...

最新文章

  1. python中,time、calendar、datetime
  2. Windows下批量删除旧文件、清除缓存文件、解救C盘、拒绝C盘爆炸
  3. Gradle 10分钟上手指南
  4. xml与java代码相互装换的工具类
  5. python循环经典例题_python练习题:循环打印嵌套列表
  6. 通过哪吒动漫豆瓣影评,带你分析python爬虫与BeautifulSoup快速入门
  7. leetcode题解179-最大数
  8. Kernel panic - not syncing:Attempted to kill...
  9. Linux系统安装完成后创建交换空间
  10. Vsftp的PASV模式和Port模式及VsFTP配置方案
  11. Excel十八个快捷键
  12. HDTune硬盘检测工具
  13. 操作系统教程(第6版) 预习笔记
  14. CSDN写漂亮博客的技巧--改字体大小颜色、插入多列表格、字体高亮等
  15. 设计模式-结构型模式(7)装饰者模式
  16. IntelliJ IDEA 2018 激活码
  17. nginx 源码编译、安装
  18. 163 新闻页面网络爬虫简单抓取数据
  19. Android 加固厂商特征
  20. 老男孩教育--50期linux高级运维脱产班 张震 决心书

热门文章

  1. Python学习笔记总结
  2. ADT版本不同导致的一个问题
  3. Object.defineProperty 接口浏览器实现的bug.和疑惑
  4. Linux中的sh+source+export
  5. 数据结构上机实践第八周项目3-顺序串算法
  6. 机器视觉——单目相机模型(坐标标定以及去畸变)
  7. 【思维导图】nav_msgs/Odometry 消息的构成及订阅
  8. Eratosthenes筛法求素数
  9. 电脑主板跳线_电脑主板跳线连接图
  10. 全局中断_【安全圈】微软更新造成Office 365等多个在线服务中断!