洛谷P3726 [AH2017/HNOI2017]抛硬币(组合数+扩展Lucas)
题面
题解
果然……扩展\(Lucas\)学了跟没学一样……
我们先考虑\(a=b\)的情况,这种情况下每一个\(A\)胜的方案中\(A\)和\(B\)的所有位上一起取反一定是一个\(A\)败的方案,而平局的方案取反之后仍然是一个平局的方案。那么我们可以用总的方案数\(2^{a+b}\)减去平局的次数除以\(2\)就行了。平局的次数我们可以考虑枚举两边扔了多少次正面,那么答案就是
\]
可以这么证明,\({n\choose i}={n\choose n-i}\),所以\({n\choose i}^2={n\choose i}\times {n\choose n-i}\),可以看做是左边\(n\)个里取\(i\)个的方案,右边\(n\)个里取\(n-i\)个的方案。然后我们枚举\(i\),最后就等价于从\(2n\)个物品里选择\(n\)个物品的方案
接下来是\(a>b\)的情况,首先一种\(A\)败或平局的方案取反之后一定是\(A\)胜。然后\(A\)胜取反之后可能还是\(A\)胜。所以我们需要用总方案数加上\(A\)取反之后仍然获胜的方案数再除以\(2\)
设\(W_A\)表示\(A\)获胜的次数,\(W_B\)同理,那么我们就是要满足\(W_A>W_B\)且\(a-W_A>b-W_B\),化简之后可得\(a-b>W_A-W_B>0\)
那么我们枚举\(W_B\)和\(W_A-W_B\),有
ans
&=\sum_{i=0}^b\sum_{j=1}^{a-b-1}{b\choose i}{a\choose i+j}\\
&=\sum_{i=0}^b\sum_{j=1}^{a-b-1}{b\choose b-i}{a\choose i+j}\\
&=\sum_{j=1}^{a-b-1}\sum_{i=0}^b{b\choose b-i}{a\choose i+j}\\
&=\sum_{j=1}^{a-b-1}\sum_{i+k=b+j}{b\choose i}{a\choose k}\\
&=\sum_{j=1}^{a-b-1}{a+b\choose b+j}\\
\end{aligned}
\]
然后就\(ok\)了,剩下的用扩展\(Lucas\)计算就行了
//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int N=2e6+5,inf=2147483647;
int fac[2][N],P,k,d1,d2,res;ll a,b;
inline int mul(R int x,R int y,R int p){return 1ll*x*y-1ll*x*y/p*p;}
int ksm(R int x,R ll y,R int p){
R int res=1;
for(;y;y>>=1,x=1ll*x*x%p)if(y&1)res=1ll*res*x%p;
return res;
}
void exgcd(int a,int b,int &x,int &y){
if(!b)return x=1,y=0,void();
exgcd(b,a%b,y,x),y-=a/b*x;
}
inline int Inv(int n,int p){
if(!n)return 0;
int x,y;exgcd(n,p,x,y);
x=(x%p+p)%p;return x?x:x+p;
}
int Fac(ll n,int pi,int pk){
if(!n)return 1;
int res=ksm(fac[pi!=2][pk],n/pk,pk);
return 1ll*res*fac[pi!=2][n%pk]%pk*Fac(n/pi,pi,pk)%pk;
}
int C(ll n,ll m,int pi,int pk){
if(n<m)return 0;
int r=0;
for(R ll i=n;i;i/=pi)r+=i/pi;
for(R ll i=m;i;i/=pi)r-=i/pi;
for(R ll i=n-m;i;i/=pi)r-=i/pi;
if(r>=k)return 0;
int a=Fac(n,pi,pk),b=Fac(m,pi,pk),c=Fac(n-m,pi,pk),res;
res=1ll*a*Inv(b,pk)%pk*Inv(c,pk)%pk*ksm(pi,r,pk)%pk;
return 1ll*res*(P/pk)%P*Inv(P/pk,pk)%P;
}
int exLucas(ll n,ll m){
if(n<m)return 0;
int res=0;
(res+=C(n,m,2,d1))%=P;
(res+=C(n,m,5,d2))%=P;
return res;
}
void init(){
fac[0][0]=fac[1][0]=1;
fp(i,1,512)fac[0][i]=(i&1)?mul(fac[0][i-1],i,512):fac[0][i-1];
fp(i,1,1953125)fac[1][i]=(i%5)?mul(fac[1][i-1],i,1953125):fac[1][i-1];
}
int main(){
// freopen("testdata.in","r",stdin);
init();
while(~scanf("%lld%lld%d",&a,&b,&k)){
P=ksm(10,k,inf),d1=ksm(2,k,inf),d2=ksm(5,k,inf);
res=ksm(2,a+b-1,P);
if(a==b)(res+=P-exLucas((a<<1)-1,a))%=P;
else{
fp(i,1,((a-b-1)>>1))(res+=exLucas(a+b,b+i))%=P;
if(!((a+b)&1))(res+=exLucas(a+b-1,(a+b)>>1))%=P;
}
while(res<P/10)putchar('0'),P/=10;
printf("%d\n",res);
}
return 0;
}
洛谷P3726 [AH2017/HNOI2017]抛硬币(组合数+扩展Lucas)的更多相关文章
- [AH2017/HNOI2017]抛硬币(扩展lucas)
推式子+exlucas. 题意: 小 A 和小 B 是一对好朋友,两个人同时抛 b 次硬币,如果小 A 的正面朝上的次数大于小 B 正面朝上的次数,则小 A 获胜. 小 A 决定在小 B 没注意的时候 ...
- luogu P3726 [AH2017/HNOI2017]抛硬币
传送门 我是真的弱,看题解都写了半天,,, 这题答案应该是\(\sum_{i=1}^{a}\binom{a}{i}\sum_{j=0}^{min(b,i-1)}\binom{b}{j}\) 上面那个式 ...
- BZOJ4830 [Hnoi2017]抛硬币 【扩展Lucas】
题目链接 BZOJ4830 题解 当\(a = b\)时,我们把他们投掷硬币的结果表示成二进制,发现,当\(A\)输给\(B\)时,将二进制反转一下\(A\)就赢了\(B\) 还要除去平局的情况,最后 ...
- 洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告
P3723 [AH2017/HNOI2017]礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个 ...
- 洛谷 P3721 - [AH2017/HNOI2017]单旋(LCT)
洛谷题面传送门 终于调出来这道题了,写篇题解( 首先碰到这样的题我们肯定要考虑每种操作会对树的形态产生怎样的影响: 插入操作:对于 BST 有一个性质是,当你插入一个节点时,其在 BST 上的父亲肯定 ...
- [luogu3726 HNOI2017] 抛硬币 (拓展lucas)
传送门 数学真的太优秀了Orz 数据真的太优秀了Orz 题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月, ...
- 题解 洛谷 P3726 【[AH2017/HNOI2017]抛硬币】
可以分别枚举两人正面朝上的次数来统计答案,所求即为 \[\sum_{i=0}^{a}\sum_{j=0}^{b} \binom{a}{i} \binom{b}{j} [i>j] \] 将\(i\ ...
- [AH2017/HNOI2017]抛硬币
传送门 这个题的暴力比较好想--然后用一些组合的知识就可以变成正解了. 首先我们考虑a=b的情况.我们把扔出来的硬币看成是一个01序列,那么对于一个b获胜的序列,他在每一位都按位异或1之后必然是一个a ...
- 洛谷P3722 [AH2017/HNOI2017]影魔(线段树)
题意 题目链接 Sol 题解好神仙啊qwq. 一般看到这种考虑最大值的贡献的题目不难想到单调数据结构 对于本题而言,我们可以预处理出每个位置左边第一个比他大的位置\(l_i\)以及右边第一个比他大的位 ...
随机推荐
- Day2-Python基础2---字符串操作
一.字符串操作 特性:不可修改 name = "my \tname is {name} and i am {year} old" #首字母大写.capitalize print(n ...
- 文件锁简单操作(lockfileEx\unlockfileEx)
#include "stdafx.h"#include <Windows.h>#include <iostream> using namespace std ...
- javascript——对象的基础知识
一.javascript作为脚本语言可以完成以下任务: 操纵浏览器对象,如窗口的打开与关闭: 操纵Dom树: 通过XMLHttpRequest对象与服务器端进行异步通信: XML编程,借助于Activ ...
- 问题:c# json解析;结果:c# 解析JSON的几种办法
c# 解析JSON的几种办法 欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把. 搜索过程中免不了碰到一大堆名词:WCF => Da ...
- 关于更新pip的心得
如果pip install --upgrade pip 删除了自己,但是无法安装新的自己. 那么下载最新的pip,解压 1.在命令窗口输入 python(前提条件已经在系统路径) setup.py ...
- DAY15-web框架本质及第一个Django实例
Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...
- Shiro权限框架简介
http://blog.csdn.net/xiaoxian8023/article/details/17892041 Shiro权限框架简介 2014-01-05 23:51 3111人阅读 评论 ...
- 『原』在Linux下反编译Android .apk文件 使用apktool dex2jar JD-eclipse
一.使用apktool 将 apk反编译生成程序的源代码和图片.XML配置.语言资源等文件 具体步骤: (1)下载反编译工具包:apktool 官方的打不开 http://apktool.shouji ...
- 如何使用google等一系列搜索引擎?
对于我们经常使用的搜索引擎大家都都不陌生,但是,如何高效的利用呢?大家都知道空格是搜索多个关键词,那么有没有其他的快捷键呢?答案是肯定的,以下内容转自知乎 1.双引号 把搜索词放在双引号中,代表完全匹 ...
- Android中pull解析XML文件的简单使用
首先,android中解析XML文件有三种方式,dom,sax,pull 这里先讲pull,稍候会说SAX和DOM pull是一种事件驱动的xml解析方式,不需要解析整个文档,返回的值是数值型,是推荐 ...