题解 洛谷 P3726 【[AH2017/HNOI2017]抛硬币】
可以分别枚举两人正面朝上的次数来统计答案,所求即为
\]
将\(i\)替换为\(i+j\)来保证\(i>j\)
&\sum_{i=0}^{a}\sum_{j=0}^{b} \binom{a}{i} \binom{b}{j} [i>j] \\
=&\sum_{i=1}^{a}\sum_{j=0}^{a-i} \binom{a}{i+j} \binom{b}{j} \\
=&\sum_{i=1}^{a}\sum_{j=0}^{a-i} \binom{a}{i+j} \binom{b}{b-j}
\end{aligned} \]
由范德蒙德卷积得
&\sum_{i=1}^{a}\sum_{j=0}^{a-i} \binom{a}{i+j} \binom{b}{b-j}\\
=&\sum_{i=1}^{a} \binom{a+b}{b+i} \\
=&\sum_{i=b+1}^{a+b} \binom{a+b}{i}
\end{aligned} \]
直接求化简后的式子复杂度无法接受,但发现\(a\)和\(b\)的差值很小,所以将式子进一步转化得
&\sum_{i=b+1}^{a+b} \binom{a+b}{i} \\
=&\sum_{i=\lceil \frac{a+b}{2} \rceil}^{a+b} \binom{a+b}{i}+\sum_{i=b+1}^{\lfloor \frac{a+b}{2} \rfloor} \binom{a+b}{i}
\end{aligned} \]
第一项的值可以快速计算,当\(a+b\)为奇数时,其为\(2^{a+b-1}\),当\(a+b\)为偶数时,其为\(2^{a+b-1}-\frac{1}{2}\binom{a+b}{\frac{a+b}{2}}\),第二项的值用扩展卢卡斯计算组合数即可。
用扩展卢卡斯计算组合数时,可以预处理阶乘和进行特判来优化。
\(code:\)
#include<bits/stdc++.h>
#define maxn 2000010
#define inf 2000000000
using namespace std;
typedef long long ll;
ll a,b,t,k2,k5,mod,ans,x,y;
ll f[6][maxn];
ll exgcd(ll a,ll b)
{
if(!b)
{
x=1,y=0;
return a;
}
ll ans=exgcd(b,a%b),tmp=x;
x=y,y=tmp-a/b*y;
return ans;
}
ll inv(ll a,ll p)
{
if(!a) return 0;
exgcd(a,p);
return (x%p+p)%p;
}
ll qp(ll x,ll y,ll p)
{
ll v=1;
while(y)
{
if(y&1) v=v*x%p;
x=x*x%p,y>>=1;
}
return v;
}
ll fac(ll x,ll p,ll k)
{
if(!x) return 1;
return qp(f[p][k],x/k,k)*f[p][x%k]%k*fac(x/p,p,k)%k;
}
ll C(ll n,ll m,ll p,ll k,bool type)
{
if(n<m) return 0;
ll sum=0,v=1;
for(ll i=n;i;i=i/p) sum+=i/p;
for(ll i=m;i;i=i/p) sum-=i/p;
for(ll i=n-m;i;i=i/p) sum-=i/p;
if(type)
{
if(p==2) sum--;
else v=inv(2,k);
}
if(sum>=t) return 0;
return v*fac(n,p,k)%k*qp(p,sum,k)%k*inv(fac(m,p,k),k)%k*inv(fac(n-m,p,k),k)%k;
}
ll crt(ll x,ll p)
{
return x*inv(mod/p,p)%mod*(mod/p)%mod;
}
ll exlucas(ll n,ll m,bool type)
{
if(n<m) return 0;
return (crt(C(n,m,2,k2,type),k2)+crt(C(n,m,5,k5,type),k5))%mod;
}
void init()
{
f[2][0]=f[5][0]=1;
for(int i=1;i<=512;++i)
{
f[2][i]=f[2][i-1];
if(i&1) f[2][i]=f[2][i]*i%512;
}
for(int i=1;i<=1953125;++i)
{
f[5][i]=f[5][i-1];
if(i%5) f[5][i]=f[5][i]*i%1953125;
}
}
int main()
{
init();
while(scanf("%lld%lld%lld",&a,&b,&t)!=EOF)
{
mod=qp(10,t,inf),ans=qp(2,a+b-1,mod),k2=qp(2,t,inf),k5=qp(5,t,inf);
for(ll i=b+1;i<=(a+b)/2;++i) ans=(ans+exlucas(a+b,i,0))%mod;
if((a+b)%2==0) ans=(ans-exlucas(a+b,(a+b)/2,1)+mod)%mod;
printf("%0*lld\n",t,ans);
}
return 0;
}
题解 洛谷 P3726 【[AH2017/HNOI2017]抛硬币】的更多相关文章
- 洛谷P3726 [AH2017/HNOI2017]抛硬币(组合数+扩展Lucas)
题面 传送门 题解 果然--扩展\(Lucas\)学了跟没学一样-- 我们先考虑\(a=b\)的情况,这种情况下每一个\(A\)胜的方案中\(A\)和\(B\)的所有位上一起取反一定是一个\(A\)败 ...
- luogu P3726 [AH2017/HNOI2017]抛硬币
传送门 我是真的弱,看题解都写了半天,,, 这题答案应该是\(\sum_{i=1}^{a}\binom{a}{i}\sum_{j=0}^{min(b,i-1)}\binom{b}{j}\) 上面那个式 ...
- 洛谷 P3721 - [AH2017/HNOI2017]单旋(LCT)
洛谷题面传送门 终于调出来这道题了,写篇题解( 首先碰到这样的题我们肯定要考虑每种操作会对树的形态产生怎样的影响: 插入操作:对于 BST 有一个性质是,当你插入一个节点时,其在 BST 上的父亲肯定 ...
- 洛谷 P3723 [AH2017/HNOI2017]礼物 解题报告
P3723 [AH2017/HNOI2017]礼物 题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手环,一个留给自己,一个送给她.每个手环上各有 \(n\) 个 ...
- [AH2017/HNOI2017]抛硬币(扩展lucas)
推式子+exlucas. 题意: 小 A 和小 B 是一对好朋友,两个人同时抛 b 次硬币,如果小 A 的正面朝上的次数大于小 B 正面朝上的次数,则小 A 获胜. 小 A 决定在小 B 没注意的时候 ...
- [AH2017/HNOI2017]抛硬币
传送门 这个题的暴力比较好想--然后用一些组合的知识就可以变成正解了. 首先我们考虑a=b的情况.我们把扔出来的硬币看成是一个01序列,那么对于一个b获胜的序列,他在每一位都按位异或1之后必然是一个a ...
- 洛谷P3722 [AH2017/HNOI2017]影魔(线段树)
题意 题目链接 Sol 题解好神仙啊qwq. 一般看到这种考虑最大值的贡献的题目不难想到单调数据结构 对于本题而言,我们可以预处理出每个位置左边第一个比他大的位置\(l_i\)以及右边第一个比他大的位 ...
- 洛谷P3721 [AH2017/HNOI2017]单旋(线段树 set spaly)
题意 题目链接 Sol 这题好毒瘤啊.. 首先要观察到几个性质: 将最小值旋转到根相当于把右子树变为祖先的左子树,然后将原来的根变为当前最小值 上述操作对深度的影响相当于右子树不变,其他的位置-1 然 ...
- 洛谷P3724 [AH2017/HNOI2017]大佬(决策单调性)
传送门 这个思路很妙诶->这里 以下为了方便,我把自信说成血量好了 虽然表面上看起来每一天有很多种选择,然而我们首先要保证的是不死,然后考虑不死的情况下最多能拿出多少天来进行其他操作.不死可以d ...
随机推荐
- 吃货联盟订餐系统 源代码 Java初级小项目
咳咳,今天博主给大家写一个小的项目:吃货联盟订餐系统.博主不是大神(互联网架构师的路上ing),也是小白一个,不过是刚入门的小白^_^.项目功能也很简单:只是模拟日常的订餐流程呦,所以有错误以及功能不 ...
- 尚硅谷spring aop详解
spring的aop实现我们采用AspectJ的方式来实现,不采用spring框架自带的aop aspect实现有基于注解的方式,有基于xml的方式,首先我们先讲基于注解的方式,再将基于xml的方式 ...
- jmeter使用小结(一)
jmeter是用来做接口压力测试的工具.这里只是简单介绍一下使用,大家可以自行查看帮助文档, 1.打开jmeter工具,创建线程组任务 2.添加配置元件,根据需要选择设置 3.添加采样器,这里是htt ...
- Python元类实战,通过元类实现数据库ORM框架
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第19篇文章,我们一起来用元类实现一个简易的ORM数据库框架. 本文主要是受到了廖雪峰老师Python3入门教程的启 ...
- 字节流,读取 a.txt 文件内容,并打印出来
import java.io.FileInputStream;import java.io.IOException; /** 字节流,读取 a.txt 文件内容,并打印出来 */public clas ...
- 隐藏input的三种方法和区别
一.<input type="hidden" />二.<input type="text" style="display:none& ...
- mycat增加开机自启
一.安装及配置: 见https://github.com/MyCATApache/Mycat-Server 二.增加开机自启: 1.添加开机自启脚本:vim /etc/init.d/mycat.sh, ...
- SpringBoot+Mybatis一级缓存和二级缓存详解
本文主要介绍在SpringBoot项目中如何使用Mybatis的一级.二级缓存,为了演示方便,本文的数据库采用H2内存数据库,数据库连接池默认使用SpringBoot2.X自带的hikariCP. 正 ...
- List的isEmpty与==null的区别
集合的判空一般判定方法 ArrayList<Person> list = null; System.out.println(null == list);//return true Syst ...
- 05 Vue项目搭建
Vue-CLI 项目搭建 1.环境搭建 安装node 官网下载安装包,傻瓜式安装:https://nodejs.org/zh-cn/ 安装cnpm npm install -g cnpm --regi ...