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

    题意: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. 重温WCF之WCF传输安全(十三)(3)基于SSL的WCF对客户端验证(转)

    转载地址:http://www.cnblogs.com/lxblog/archive/2012/09/18/2690719.html 上文我们演示了,客户端对服务器端身份的验证,这一篇来简单演示一下对 ...

  2. react.js 多个组件集成示例

    这个看得有点懵, 可能要结合其它实例看. html <!DOCTYPE html> <html> <head> <script src="http: ...

  3. linux 下解压rar文件

    今天遇到要在linux 服务器上解压几个rar 文件的问题,rar似乎是win 专属的压缩格式,所以linux 原生工具链中并没有支持rar 解压的工具.经过一系列搜索确定了一个脚linuxrar 的 ...

  4. 攻城狮在路上(叁)Linux(十六)--- 命令与文件的查找

    一.脚本文件的查询: 1.命令格式:which [-a] command; <==通过PATH来查找. -a:列出所有的,而不是仅列出第一个. 示例: which ifconfig; 注意:由于 ...

  5. hdu 1851 尼姆+巴什博弈

    先在每堆中进行巴什博弈,然后尼姆 #include<stdio.h> int main() { int T; int i,n; int ans,m,l; scanf("%d&qu ...

  6. GitHub 使用教程图文详解(转)

    大纲: 一.前言 二.GitHub简介 三.注册GitHub账号 四.配置GitHub 五.使用GitHub 六.参与GitHub中其它开源项目 七.总结 注,GitHub官网:https://git ...

  7. C# Thread 线程状态知识

    .NET 基础类库的System.Threading命名空间提供了大量的类和接口支持多线程.这个命名空间有很多的类.System.Threading.Thread类是创建并控制线程,设置其优先级并获取 ...

  8. Intent界面跳转与传递数据

    Activity跳转与传值,主要是通过Intent类,Intent的作用是激活组件和附带数据. intent可以激活Activity,服务,广播三类组件. 本博文讲的是显示意图激活Activity组件 ...

  9. loadrunner比较有用的字符串函数

    loadrunner比较有用的字符串函数 ******************************************************************************* ...

  10. 记录java基础的学习过程

    标识符(类名:变量.属性.方法名: ) 组成:类名开头不能是数字,只能有字母数字_$组成. 命名规范: 类名每一个单词首字母大写(HelloWorld大驼峰法则), 方法名 属性名 变量名首字母小写之 ...