题目描述

小 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 补全。

输入输出样例

输入样例#1: 复制

  1. 2 1 9
  2. 3 2 1
输出样例#1: 复制

  1. 000000004
  2. 6

说明

对于第一组数据,当小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,输出时取模

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. ll K,fac[][];
  8. ll exgcd(ll a,ll b,ll &x,ll &y)
  9. {
  10. if (b==)
  11. {
  12. x=;y=;
  13. return a;
  14. }
  15. ll d=exgcd(b,a%b,x,y);
  16. ll t=x;x=y;y=t-(a/b)*x;
  17. return d;
  18. }
  19. ll qpow(ll a,ll b,ll mod)
  20. {
  21. ll res=;
  22. while (b)
  23. {
  24. if (b&) res=res*a%mod;
  25. a=a*a%mod;
  26. b/=;
  27. }
  28. return res;
  29. }
  30. ll rev(ll a,ll b)
  31. {
  32. ll x,y;
  33. exgcd(a,b,x,y);
  34. return (x%b+b)%b;
  35. }
  36. ll calfac(ll x,ll p,ll t)
  37. {
  38. if (x<t) return fac[t][x];
  39. ll s=qpow(fac[t][p-],x/p,p);
  40. s=(s*fac[t][x%p])%p;
  41. s=(s*calfac(x/t,p,t))%p;
  42. return s;
  43. }
  44. ll lucas(ll b,ll a,ll t,ll p,bool q)
  45. {ll i;
  46. if (b<a) return ;
  47. ll ap=,bp=,cp=;
  48. for (i=b;i;i/=t) ap+=i/t;
  49. for (i=a;i;i/=t) bp+=i/t;
  50. for (i=b-a;i;i/=t) cp+=i/t;
  51. ap=ap-bp-cp;
  52. if (q==&&t==) ap--;
  53. if (ap>=K) return ;
  54. ll s=qpow(t,ap,p);
  55. ap=calfac(b,p,t);bp=calfac(a,p,t),cp=calfac(b-a,p,t);
  56. s=((s*ap%p)*(rev(bp,p)*rev(cp,p))%p)%p;
  57. if (q&&t==) s=s*rev(,p)%p;
  58. return s;
  59. }
  60. ll cal(ll a,ll b,ll Mod,ll pr)
  61. {ll i;
  62. ll ans=qpow(,a+b-,Mod);
  63. if (a==b)
  64. {
  65. ans=(ans-lucas(a+b,a,pr,Mod,)+Mod)%Mod;
  66. return ans;
  67. }
  68. else
  69. {
  70. for (i=(a+b)/+;i<a;i++)
  71. ans=(ans+lucas(a+b,i,pr,Mod,)+Mod)%Mod;
  72. }
  73. if ((a+b)%==) ans=(ans+lucas(a+b,(a+b)/,pr,Mod,)+Mod)%Mod;
  74. return ans;
  75. }
  76. ll work(ll a,ll b,ll k)
  77. {
  78. ll p1=qpow(,k,2e9+),p2=qpow(,k,2e9+),mod=qpow(,k,2e9+);
  79. ll b1=cal(a,b,p1,),b2=cal(a,b,p2,);
  80. ll a1=rev(p2,p1),a2=rev(p1,p2);
  81. return (b1*(p2*a1%mod)%mod+b2*(p1*a2%mod)%mod)%mod;
  82. }
  83. void print(ll d,ll k)
  84. {
  85. if (k==)
  86. printf("%01lld\n",d%qpow(,,2e9+));
  87. if (k==)
  88. printf("%02lld\n",d%qpow(,,2e9+));
  89. if (k==)
  90. printf("%03lld\n",d%qpow(,,2e9+));
  91. if (k==)
  92. printf("%04lld\n",d%qpow(,,2e9+));
  93. if (k==)
  94. printf("%05lld\n",d%qpow(,,2e9+));
  95. if (k==)
  96. printf("%06lld\n",d%qpow(,,2e9+));
  97. if (k==)
  98. printf("%07lld\n",d%qpow(,,2e9+));
  99. if (k==)
  100. printf("%08lld\n",d%qpow(,,2e9+));
  101. if (k==)
  102. printf("%09lld\n",d%qpow(,,2e9+));
  103. }
  104. int main()
  105. {ll a,b,k,i,p;
  106. fac[][]=;p=qpow(,,2e9+);
  107. for (i=;i<=p-;i++)
  108. if (i%==) fac[][i]=fac[][i-];
  109. else fac[][i]=fac[][i-]*i%p;
  110. fac[][]=;p=qpow(,,2e9+);
  111. for (i=;i<=p-;i++)
  112. if (i%==) fac[][i]=fac[][i-];
  113. else fac[][i]=fac[][i-]*i%p;
  114. while (cin>>a>>b>>k)
  115. {
  116. K=;ll d=work(a,b,);
  117. print(d,k);
  118. }
  119. }

[AH/HNOI2017]抛硬币的更多相关文章

  1. bzoj 4830: [Hnoi2017]抛硬币 [范德蒙德卷积 扩展lucas]

    4830: [Hnoi2017]抛硬币 题意:A投a次硬币,B投b次硬币,a比b正面朝上次数多的方案数,模\(10^k\). \(b \le a \le b+10000 \le 10^{15}, k ...

  2. 【BZOJ4830】[HNOI2017]抛硬币(组合计数,拓展卢卡斯定理)

    [BZOJ4830][HNOI2017]抛硬币(组合计数,拓展卢卡斯定理) 题面 BZOJ 洛谷 题解 暴力是啥? 枚举\(A\)的次数和\(B\)的次数,然后直接组合数算就好了:\(\display ...

  3. bzoj 4830: [Hnoi2017]抛硬币

    Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于**师手游,天天刷本,根本无心搞学习.但是 已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A ...

  4. bzoj4830 hnoi2017 抛硬币

    题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生.勤勉的小 A ...

  5. luogu P3726 [AH2017/HNOI2017]抛硬币

    传送门 我是真的弱,看题解都写了半天,,, 这题答案应该是\(\sum_{i=1}^{a}\binom{a}{i}\sum_{j=0}^{min(b,i-1)}\binom{b}{j}\) 上面那个式 ...

  6. 【刷题】BZOJ 4830 [Hnoi2017]抛硬币

    Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A为 ...

  7. [HNOI2017]抛硬币

    Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于××师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A为 ...

  8. [luogu3726 HNOI2017] 抛硬币 (拓展lucas)

    传送门 数学真的太优秀了Orz 数据真的太优秀了Orz 题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月, ...

  9. [AH2017/HNOI2017]抛硬币(扩展lucas)

    推式子+exlucas. 题意: 小 A 和小 B 是一对好朋友,两个人同时抛 b 次硬币,如果小 A 的正面朝上的次数大于小 B 正面朝上的次数,则小 A 获胜. 小 A 决定在小 B 没注意的时候 ...

随机推荐

  1. bug终结者 团队作业第八周

    bug终结者 团队作业第八周 本次任务 素材提供及编辑:20162328 蔡文琛 博客修改完善:20162322 朱娅霖 "bug终结者" 宏伟蓝图 UML 手绘底稿 用例图 选项 ...

  2. C语言——第七周作业

    题目 题目一:求交错序列前N项和 1.实验代码 #include <stdio.h> int main() { int n , i , b ; , a , c ; scanf(" ...

  3. Winserver+Apache+django部署

    废话不多说,干活直接上. winserver2012 + django2.0.1 + apache 部署过程 python ==> 3.4 64位 https://www.python.org/ ...

  4. HTML事件处理程序

    事件处理程序中的代码执行时,有权访问全局作用域中任何代码. //为按钮btn_event添加了两个个事件处理程序,而且该事件会在冒泡阶段触发(最后一个参数是false). var btn_event ...

  5. JavaScript Cookie使用实例

    # Session-Cookie //  利用Cookie防止在1分钟内多次提交: function SetCookie (name, value) { var Days = 30; var exp ...

  6. 可空类型 Nullable<T>

    Nullable<T> 内部实现了显示和隐式转换 显示转换: public static explicit operator T(T? value) { return value.Valu ...

  7. Nginx动静分离架构

    Nginx动静分离简单来说就将动态与静态资源分开,不能理解成只是单纯的把动态页面和静态页面物理分离,严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat,Res ...

  8. 新概念英语(1-117)Tommy's breakfast

    Lesson 117  Tommy's breakfast 汤米的早餐 Listen to the tape then answer this question. What does she mean ...

  9. 新概念英语(1-11)Is this your shirt ?

    Is this your shirt?Whose shirt is white? A:Whose shirt is that? Is this your shirt, Dave? Dave:No si ...

  10. ELK学习总结(2-4)bulk 批量操作-实现多个文档的创建、索引、更新和删除

    bulk 批量操作-实现多个文档的创建.索引.更新和删除 ----------------------------------------------------------------------- ...