题解 洛谷 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 ...
 
随机推荐
- 黑马程序员spring data jpa 2019年第一版本
			
第一步首先创建一个maven工程,导入对于的pom依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...
 - 入门大数据---Hive视图和索引
			
一.视图 1.1 简介 Hive 中的视图和 RDBMS 中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条 SELECT 语句的结果集.视图是纯粹的逻辑对象,没有关联的存储 (Hive 3.0 ...
 - GitLab Runner部署(kubernetes环境)
			
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
 - VC GDI+基础用法VC
			
#include "GdiPlus.h" // 使用GDI+ 命名空间 using namespace Gdiplus; // 与GDI+ 相关的其它头文件,如:GraphicsP ...
 - Centos7上设置zookeeper自启动
			
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/zhouzhiwengang/artic ...
 - Spring FactoryBean 缓存
			
相关文章 Spring 整体架构 编译Spring5.2.0源码 Spring-资源加载 Spring 容器的初始化 Spring-AliasRegistry Spring 获取单例流程(一) Spr ...
 - 洛谷 P2212 【[USACO14MAR]Watering the Fields S】
			
一道最小生成树模板题,这里用的Kruskal算法,把每两点就加一条边,跑一遍最小生成树即可. #include <bits/stdc++.h> using namespace std; s ...
 - hive中order by ,sort by ,distribute by, cluster by 的区别(**很详细**)
			
hive 查询语法 select [all | distinct] select_ condition, select_ condition from table_name a [join table ...
 - JavaScript学习笔记(1)
			
概念: 运行在浏览器端的脚本语言. 构成: ECMAScript(语法) + DOM(文档对象模型) + BOM(浏览器对象模型) 语法: 1.区分大小写 2.变量是弱类型 数据类型: string ...
 - 奶牛渡河——线性dp
			
奶牛渡河 题目描述 \(Farmer John\) 以及他的 \(N (1\leq N\leq 2500)\) 头奶牛打算过一条河,但他们所有的渡河工具,仅仅是一个木筏. 由于奶牛不会划船,在整个渡河 ...