【ZOJ】3380 Patchouli's Spell Cards
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的更多相关文章
- zoj 3380 Patchouli's Spell Cards 概率DP
题意:1-n个位置中,每个位置填一个数,问至少有l个数是相同的概率. 可以转化求最多有l-1个数是相同的. dp[i][j]表示前i个位置填充j个位置的方案数,并且要满足上面的条件. 则: dp[i] ...
- ZOJ 3380 Patchouli's Spell Cards
方案数,$dp$. 总的方案数有$n^m$种,符合要求的直接算不好算,可以算反面,即不符合要求的. 设$dp[i][j]$表示前$i$种等级填了$j$个位置,那么$dp[i][j]=sum(dp[i- ...
- 【ZOJ】4012 Your Bridge is under Attack
[ZOJ]4012 Your Bridge is under Attack 平面上随机n个点,然后给出m条直线,问直线上有几个点 \(n,m \leq 10^{5}\) 由于共线的点不会太多,于是我们 ...
- 【ZOJ】【3329】One Person Game
概率DP/数学期望 kuangbin总结题目中的第三道 看来还是没有进入状态啊……都说是DP了……当然是要找[状态之间的转移关系]了…… 本题中dp[i]跟 dp[i-(k1+k2+k3)] 到dp[ ...
- 【有上下界网络流】【ZOJ】2314 Reactor Cooling
[算法]有上下界网络流-无源汇(循环流) [题解]http://www.cnblogs.com/onioncyc/p/6496532.html //未提交 #include<cstdio> ...
- ZOJ-3380 Patchouli’s Spell Cards DP, 组合计数
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3380 题意:有m种不同的元素,每种元素都有n种不同的相位,现在假 ...
- 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用
转载请声明出处:http://www.cnblogs.com/kevince/p/3887827.html ——By Kevince 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这 ...
- 【ZOJ】3740:Water Level【DP】
Water Level Time Limit: 2 Seconds Memory Limit: 65536 KB Hangzhou is a beautiful city, especial ...
- 【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律
转自:http://www.cnblogs.com/kevince/p/3887827.html 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这么一说大家心里肯定有数了吧,“不就是nex ...
随机推荐
- 使用Modernizr探测HTML5/CSS3新特性(转载)
转载地址:http://www.cnblogs.com/TomXu/archive/2011/11/18/detecting-html5-css3-features-using-modernizr.h ...
- Gmail 账号找回办法
前段时间一直在用GFW代理,结果发现GOOGLE账户的保护机制起用了,要给以前的手机号发消息,结果哪个号现在不用了,所以就登陆不进去了,非常扯淡,索性谷歌了下,得出如下的解决方案,完美解决,下次直接在 ...
- Pyqt清空Win回收站
Pyqt清空回收站其实的调用Python的第三方库,通过第三方库调用windows的api删除回收站的数据 一. 准备工作 先下载第三方库winshell 下载地址: https://github.c ...
- 学习ASP.NET缓存机制
缓存是大型BS架构网站的性能优化通用手段,之前知道有这个概念,并且也知道很重要,但是一直没静下心来了解.这次借着学习PetShop源码的机会熟悉一下ASP.NET基本的缓存机制(生产环境中的真实缓存有 ...
- 构造方法 static 块 {}块 执行顺序
package com.test.innerclass; public class HelloB extends HelloA { public HelloB() { System.out.print ...
- 搜索 录音功能 Android api
搜索 录音功能 Android api http://www.oschina.net/android/47/ http://m.blog.csdn.net/blog/u011309801/406523 ...
- Java中的异或(转)
在java程序里面的异或用法: 相同输出0,不同输出1,例如: System.out.println(1^1); 输出0 System.out.println(1^2):输出3,因为最后2个低位都不一 ...
- UML 之 四种关系
学习过UML的人都知道,UML之中有九种图和四种关系,今天,我们先来介绍一下这四种关系: 对于我们这些初学者来说,UML之中无非是 关联.依赖.泛化和实现,但是其中,关联和依赖又如何区分?泛化又如何 ...
- JavaScript模拟函数重载
JavaScript是没有函数重载的,但是我们可以通过其他方法来模拟函数重载,如下所示: <!DOCTYPE html> <html> <head> <met ...
- 【java 获取数据库信息】获取MySQL或其他数据库的详细信息
1.首先是 通过数据库获取数据表的详细列信息 package com.sxd.mysqlInfo.test; import java.sql.Connection; import java.sql.D ...