bzoj 4830: [Hnoi2017]抛硬币
Description
小A和小B是一对好朋友,他们经常一起愉快的玩耍。最近小B沉迷于**师手游,天天刷本,根本无心搞学习。但是
已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生。勤勉的小A为了劝说小B早日脱坑,认真学习,决
定以抛硬币的形式让小B明白他是一个彻彻底底的非洲人,从而对这个游戏绝望。两个人同时抛b次硬币,如果小A
的正面朝上的次数大于小B正面朝上的次数,则小A获胜。但事实上,小A也曾经沉迷过拉拉游戏,而且他一次UR也
没有抽到过,所以他对于自己的运气也没有太大把握。所以他决定在小B没注意的时候作弊,悄悄地多抛几次硬币
,当然,为了不让小B怀疑,他不会抛太多次。现在小A想问你,在多少种可能的情况下,他能够胜过小B呢?由于
答案可能太大,所以你只需要输出答案在十进制表示下的最后k位即可。
solution
正解:扩展卢卡斯
因为 \(a-b\) 很小,考虑怎么把式子变成和 \(a-b\) 有关.
考虑 \(a=b\) 的情况,考虑结果只有输赢和平局三种,而且输赢是对称的,所以减去平局就是答案,所以答案为 \((2^{a+b}-C(2a,a))/2\).
\(a>b\) 时,同样存在对称性,对于正着会输,反过来就赢得情况,就是 \(2^{a+b}/2\) 种
对于正着反着都赢的情况还没有算进去:
\]
\]
\]
\]
对于除2,根据对称性,只算一半即可,注意偶数情况,存在一项需要手动除2,算2时在因子中减去,算5时直接乘逆元即可
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
const int N=2500005;
ll qm(ll x,ll k,ll MO){
ll sum=1;
while(k){
if(k&1)sum*=x,sum%=MO;
x*=x;x%=MO;k>>=1;
}
return sum;
}
ll v[2][N],mod,K;
void priwork(){
int lim=qm(2,9,N);
v[0][0]=v[1][0]=1;
for(RG int i=1;i<=lim;i++){
v[0][i]=v[0][i-1]*((i&1)?i:1);
v[0][i]%=lim;
}
lim=qm(5,9,N);
for(RG int i=1;i<=lim;i++){
v[1][i]=v[1][i-1]*((i%5)?i:1);
v[1][i]%=lim;
}
}
inline void exgcd(ll a,ll b,ll &x,ll &y){
if(!b)x=1,y=0;
else exgcd(b,a%b,y,x),y-=a/b*x;
}
inline ll ni(ll a,ll b){
ll x,y;
exgcd(a,b,x,y);
x%=b;if(x<0)x+=b;
return x;
}
inline ll Fac(ll n,ll p,ll pr){
if(n==0)return 1;
ll re=v[p!=2][pr]%pr;
re=qm(re,n/pr,pr);
ll r=n%pr;
re=re*v[p!=2][r]%pr;
return re*Fac(n/p,p,pr)%pr;
}
inline ll C(ll n,ll m,ll p,ll pr,bool t){
if(n<m)return 0;
ll c=0;
for(RG ll i=n;i;i/=p)c+=(i/p);
for(RG ll i=m;i;i/=p)c-=(i/p);
for(RG ll i=n-m;i;i/=p)c-=(i/p);
if(t && p==2)c--;
if(c>=K)return 0;
ll x=Fac(n,p,pr),y=Fac(m,p,pr),z=Fac(n-m,p,pr);
ll re=x*ni(y,pr)%pr*ni(z,pr)%pr*qm(p,c,pr)%pr;
if(t && p==5)re=re*ni(2,pr)%pr;
return (mod/pr)*ni(mod/pr,pr)%mod*re%mod;
}
inline ll lucas(ll n,ll m,ll k,bool t){
ll MOD=qm(2,k,N),re=0;
re=(re+C(n,m,2,MOD,t))%mod;
MOD=qm(5,k,N);
re=(re+C(n,m,5,MOD,t))%mod;
return re;
}
ll work(ll n,ll m,ll k)
{
ll ans=0;mod=qm(10,k,1e9+5);
if(n==m)
return ((qm(2,n+m-1,mod)-lucas(n+m,n,k,1))%mod+mod)%mod;
for(ll i=(n+m)/2+1;i<n;i++){
ans+=lucas(n+m,i,k,0);
ans%=mod;
}
if((n+m)%2==0)ans=(ans+lucas(n+m,(n+m)/2,k,1)%mod+mod)%mod;
return (qm(2,n+m-1,mod)+ans)%mod;
}
inline void Print(ll x,ll c){
if(c==1)printf("%lld\n",x);if(c==2)printf("%02lld\n",x);
if(c==3)printf("%03lld\n",x);if(c==4)printf("%04lld\n",x);
if(c==5)printf("%05lld\n",x);if(c==6)printf("%06lld\n",x);
if(c==7)printf("%07lld\n",x);if(c==8)printf("%08lld\n",x);
if(c==9)printf("%09lld\n",x);
}
int main()
{
priwork();
ll a,b,c,d;
while(~scanf("%lld%lld%lld",&a,&b,&c)){
K=c;d=work(a,b,c);
Print(d,c);
}
return 0;
}
bzoj 4830: [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 ...
- 【刷题】BZOJ 4830 [Hnoi2017]抛硬币
Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A为 ...
- 【BZOJ4830】[HNOI2017]抛硬币(组合计数,拓展卢卡斯定理)
[BZOJ4830][HNOI2017]抛硬币(组合计数,拓展卢卡斯定理) 题面 BZOJ 洛谷 题解 暴力是啥? 枚举\(A\)的次数和\(B\)的次数,然后直接组合数算就好了:\(\display ...
- [AH/HNOI2017]抛硬币
题目描述 小 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}\) 上面那个式 ...
- [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 没注意的时候 ...
随机推荐
- beta冲刺7-咸鱼
前言:最后一篇惹.明天就是正式交差了.有点慌-- 昨天的未完成: 用户试用+测评 输入部分的正则式判定 今天的工作: 登陆界面修改 我的社团显示效果优化 部分信息注册后锁定无法修改 其他部分功能优化 ...
- 个人作业2:QQ音乐APP案例分析
APP案例分析 QQ音乐 选择理由:毕竟作为QQ音乐九年的资深老用户以及音乐爱好者 第一部分 调研 1.第一次上手的体验 我算是很早期的QQ音乐的用户,用QQ音乐七八年,除了体验各方面还不错之外 ...
- iOS开发-简单的循环结构分析
1.while循环 while (循环条件) { 循环体: } // 1.定义循环变量 ; // 2.循环条件 ) { // 3.循环体 printf("%d\n" ...
- SDVN
Software Defined Vehicular Networks VANET 车载自组网(VANET)是指在交通环境中车辆之间.车辆与固定接入点之间及车辆与行人之间相互通信组成的开放式移动Ad ...
- 直方图均衡化及matlab实现
在处理图像时,偶尔会碰到图像的灰度级别集中在某个小范围内的问题,这时候图像很难看清楚.比如下图: 它的灰度级别,我们利用一个直方图可以看出来(横坐标从0到255,表示灰度级别,纵坐标表示每个灰度级别的 ...
- vue中一个dom元素可以绑定多个事件?
其实这个问题有多个解决方法的 这里提出两点 第一种 第二种 现在dom上绑定一个 然后在你的methods中直接调用 如果要传参数 这时候千万别忘记 原创 如需转载注明出处 谢谢
- ThreadLocal源码分析:(三)remove()方法
在ThreadLocal的get(),set()的时候都会清除线程ThreadLocalMap里所有key为null的value. 而ThreadLocal的remove()方法会先将Entry中对k ...
- Linux命令及lamp搭建
单纯属于Linux的命令:1.强制卸载有依赖关系的软件包: rpm -e httpd-2.2.15-26.el6.x86_64 --nodeps(--nodeps表示无依赖)4.删除当前目录所有的文件 ...
- [Oracle]undo表空间使用量为100%
在Toad中发现undo表空间undotbs1使用量已经达到100%,但是奇怪的是数据库并没有hang住,依然可以正常运转 通过Oracle提供的EM查看undotbs1表空间的使用,也达到了78.8 ...
- Ubuntu16.04 + Zabbix 3.4.7 邮件报警设置
部署了Zabbix,需要配置邮件报警,在网上找了一些教程,大多是是用的CentOS + Zabbix 2.x版本的,而且还要写脚本,感觉太麻烦了,所以自己结合其他文章摸索了一套配置方法. 先说一下环境 ...