[AH/HNOI2017]抛硬币
题目描述
小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍。最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习。但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生。勤勉的小 A 为了劝说小 B 早日脱坑,认真学习,决定以抛硬币的形式让小 B 明白他是一个彻彻底底的非洲人,从而对这个游戏绝望。两个人同时抛 b 次硬币,如果小 A 的正面朝上的次数大于小 B 正面朝上的次数,则小 A 获胜。
但事实上,小 A 也曾经沉迷过拉拉游戏,而且他一次 UR 也没有抽到过,所以他对于自己的运气也没有太大把握。所以他决定在小 B 没注意的时候作弊,悄悄地多抛几次硬币,当然,为了不让小 B 怀疑,他不会抛太多次。现在小 A 想问你,在多少种可能的情况下,他能够胜过小 B 呢?由于答案可能太大,所以你只需要输出答案在十进制表示下的最后 k 位即可。
输入输出格式
输入格式:
有多组数据,对于每组数据输入三个数a,b,k,分别代表小A抛硬币的次数,小B抛硬币的次数,以及最终答案保留多少位整数。
输出格式:
对于每组数据,输出一个数,表示最终答案的最后 k 位为多少,若不足 k 位以 0 补全。
输入输出样例
说明
对于第一组数据,当小A抛2次硬币,小B抛1次硬币时,共有4种方案使得小A正面朝上的次数比小B多。
(01,0), (10,0), (11,0), (11,1)
对于第二组数据,当小A抛3次硬币,小B抛2次硬币时,共有16种方案使得小A正面朝上的次数比小B多。
(001,00), (010,00), (100,00), (011,00), (101,00), (110,00), (111,00), (011,01), (101,01), (110,01),(111,01), (011,10), (101,10), (110,10), (111,10), (111,11).
数据范围
10%的数据满足a,b≤20;
30%的数据满足a,b≤100;
70%的数据满足a,b≤100000,其中有20%的数据满足a=b;
100%的数据满足1\le a,b\le 10^{15},b\le a\le b+10000,1\le k\le 91≤a,b≤1015,b≤a≤b+10000,1≤k≤9,数据组数小于等于10。
转载http://www.cnblogs.com/Yuzao/p/7954245.html
因为 \(a-b\) 很小,考虑怎么把式子变成和 \(a-b\) 有关.
考虑 \(a=b\) 的情况,赢了翻转后就输了,平局不算在内,
要减掉的。减了之后再除。推导如下:
$$\sum_{i=0}^{a}C_a^i * C_a^i = \sum_{i=0}^{a}C_a^i * C_a^{a-i} = C_{2a}^a$$
平局方案为C(2a,a)
所以答案为 \((2^{a+b}-C(2a,a))/2\).
\(a>b\) 时,同样存在对称性,对于正着会输,反过来就赢得情况,就是 \(2^{a+b}/2\) 种
对于正着反着都赢的情况还没有算进去:
\[\sum_{i=1}^{b}\sum_{j=1}^{a-b-1}C_{b}^{i}*C_{a}^{i+j}\]
\[\sum_{i=1}^{b}\sum_{j=1}^{a-b-1}C_{b}^{b-i}*C_{a}^{i+j}\]
\[\sum_{j=1}^{a-b-1}C_{a+b}^{b+j}\]
\[\sum_{j=b+1}^{a-1}C_{a+b}^{j}\]
对于除2,根据对称性,只算一半即可,注意偶数情况,存在一项需要手动除2,算2时在因子中减去,算5时直接乘逆元即可
取模不是素数,所以要中国剩余定理
可以默认模数为10^9,输出时取模
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll K,fac[][];
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if (b==)
{
x=;y=;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll t=x;x=y;y=t-(a/b)*x;
return d;
}
ll qpow(ll a,ll b,ll mod)
{
ll res=;
while (b)
{
if (b&) res=res*a%mod;
a=a*a%mod;
b/=;
}
return res;
}
ll rev(ll a,ll b)
{
ll x,y;
exgcd(a,b,x,y);
return (x%b+b)%b;
}
ll calfac(ll x,ll p,ll t)
{
if (x<t) return fac[t][x];
ll s=qpow(fac[t][p-],x/p,p);
s=(s*fac[t][x%p])%p;
s=(s*calfac(x/t,p,t))%p;
return s;
}
ll lucas(ll b,ll a,ll t,ll p,bool q)
{ll i;
if (b<a) return ;
ll ap=,bp=,cp=;
for (i=b;i;i/=t) ap+=i/t;
for (i=a;i;i/=t) bp+=i/t;
for (i=b-a;i;i/=t) cp+=i/t;
ap=ap-bp-cp;
if (q==&&t==) ap--;
if (ap>=K) return ;
ll s=qpow(t,ap,p);
ap=calfac(b,p,t);bp=calfac(a,p,t),cp=calfac(b-a,p,t);
s=((s*ap%p)*(rev(bp,p)*rev(cp,p))%p)%p;
if (q&&t==) s=s*rev(,p)%p;
return s;
}
ll cal(ll a,ll b,ll Mod,ll pr)
{ll i;
ll ans=qpow(,a+b-,Mod);
if (a==b)
{
ans=(ans-lucas(a+b,a,pr,Mod,)+Mod)%Mod;
return ans;
}
else
{
for (i=(a+b)/+;i<a;i++)
ans=(ans+lucas(a+b,i,pr,Mod,)+Mod)%Mod;
}
if ((a+b)%==) ans=(ans+lucas(a+b,(a+b)/,pr,Mod,)+Mod)%Mod;
return ans;
}
ll work(ll a,ll b,ll k)
{
ll p1=qpow(,k,2e9+),p2=qpow(,k,2e9+),mod=qpow(,k,2e9+);
ll b1=cal(a,b,p1,),b2=cal(a,b,p2,);
ll a1=rev(p2,p1),a2=rev(p1,p2);
return (b1*(p2*a1%mod)%mod+b2*(p1*a2%mod)%mod)%mod;
}
void print(ll d,ll k)
{
if (k==)
printf("%01lld\n",d%qpow(,,2e9+));
if (k==)
printf("%02lld\n",d%qpow(,,2e9+));
if (k==)
printf("%03lld\n",d%qpow(,,2e9+));
if (k==)
printf("%04lld\n",d%qpow(,,2e9+));
if (k==)
printf("%05lld\n",d%qpow(,,2e9+));
if (k==)
printf("%06lld\n",d%qpow(,,2e9+));
if (k==)
printf("%07lld\n",d%qpow(,,2e9+));
if (k==)
printf("%08lld\n",d%qpow(,,2e9+));
if (k==)
printf("%09lld\n",d%qpow(,,2e9+));
}
int main()
{ll a,b,k,i,p;
fac[][]=;p=qpow(,,2e9+);
for (i=;i<=p-;i++)
if (i%==) fac[][i]=fac[][i-];
else fac[][i]=fac[][i-]*i%p;
fac[][]=;p=qpow(,,2e9+);
for (i=;i<=p-;i++)
if (i%==) fac[][i]=fac[][i-];
else fac[][i]=fac[][i-]*i%p;
while (cin>>a>>b>>k)
{
K=;ll d=work(a,b,);
print(d,k);
}
}
[AH/HNOI2017]抛硬币的更多相关文章
- bzoj 4830: [Hnoi2017]抛硬币 [范德蒙德卷积 扩展lucas]
4830: [Hnoi2017]抛硬币 题意:A投a次硬币,B投b次硬币,a比b正面朝上次数多的方案数,模\(10^k\). \(b \le a \le b+10000 \le 10^{15}, k ...
- 【BZOJ4830】[HNOI2017]抛硬币(组合计数,拓展卢卡斯定理)
[BZOJ4830][HNOI2017]抛硬币(组合计数,拓展卢卡斯定理) 题面 BZOJ 洛谷 题解 暴力是啥? 枚举\(A\)的次数和\(B\)的次数,然后直接组合数算就好了:\(\display ...
- bzoj 4830: [Hnoi2017]抛硬币
Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于**师手游,天天刷本,根本无心搞学习.但是 已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A ...
- bzoj4830 hnoi2017 抛硬币
题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生.勤勉的小 A ...
- luogu P3726 [AH2017/HNOI2017]抛硬币
传送门 我是真的弱,看题解都写了半天,,, 这题答案应该是\(\sum_{i=1}^{a}\binom{a}{i}\sum_{j=0}^{min(b,i-1)}\binom{b}{j}\) 上面那个式 ...
- 【刷题】BZOJ 4830 [Hnoi2017]抛硬币
Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A为 ...
- [HNOI2017]抛硬币
Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于××师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A为 ...
- [luogu3726 HNOI2017] 抛硬币 (拓展lucas)
传送门 数学真的太优秀了Orz 数据真的太优秀了Orz 题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月, ...
- [AH2017/HNOI2017]抛硬币(扩展lucas)
推式子+exlucas. 题意: 小 A 和小 B 是一对好朋友,两个人同时抛 b 次硬币,如果小 A 的正面朝上的次数大于小 B 正面朝上的次数,则小 A 获胜. 小 A 决定在小 B 没注意的时候 ...
随机推荐
- mongodb 复制(副本集)
复制(副本集) 什么是复制 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性 复制还允许从硬件故障和服务中断中恢复数据 为什么要复制 数据备份 数据灾 ...
- 配置SpringAop时需要用到的AspectJ表达式
Aspectj切入点语法定义 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义切入点表达式 execu ...
- DML数据操作语言之常用函数
所谓函数,就是输入某一值,得到相应的输出结果的功能.相当于一个加工厂,给了原料,最终产出成品. 其中原料 就是参数(parameter). 产品 就是返回值. 函数大致可以分为以下五个种类: 算术函数 ...
- nyoj 矩形个数
矩形的个数 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 在一个3*2的矩形中,可以找到6个1*1的矩形,4个2*1的矩形3个1*2的矩形,2个2*2的矩形,2个3 ...
- Python扩展模块——调用WindowsAPI(pywin32的简单使用)
这块使用的比较少,只用到了模拟键盘按键, 调用鼠标比较费事,是通过像素坐标实现的,如果没有特殊需求或万不得已不建议使用 import win32con import win32api win32api ...
- Mock API是如何在开发中发光发热的?
在长期的服务过程中,我们经常会遇到前来咨询的用户与我们反馈以下这种情况:咨询者是一个前端人员,在项目开发的过程中需要与后端进行对接,遇到后端还没完成数据输出的情况下,他只好写静态模拟数据,在遇到大型项 ...
- api-gateway实践(06)新服务网关 - 请求监控
一.实时监控 用户点击服务实例,系统显示服务实例-version下的api列表, 用户点击某个api的如下两个图标 1.API请求次数监控 横轴:时间,粒度为分钟 纵轴:请求访问次数 展示:失败数(红 ...
- eclipse版本对应的jdk版本
Installing Eclipse is relatively easy, but does involve a few steps and software from at least two d ...
- gradle入门(1-2)gradle的依赖管理
Gradle支持以下仓库格式: Ivy仓库 Maven仓库 Flat directory仓库 一.添加仓库 1.添加Ivy仓库 1.1.通过URL地址添加一个Ivy仓库 我们可以将以下代码片段加入到b ...
- MongoDB系列四(索引).
一.索引简介 再来老生常谈一番,什么是索引呢?数据库索引与书籍的索引类似.有了索引就不需要翻整本书,数据库可以直接在索引中查找,在索引中找到条目以后,就可以直接跳转到目标文档的位置,这能使查找速度提高 ...