Description

题库链接

两人抛硬币一人 \(a\) 次,一人 \(b\) 次。记正面朝上多的为胜。问抛出 \(a\) 次的人胜出的方案数。

\(1\le a,b\le 10^{15},b\le a\le b+10000,1\le k\le 9\)

Solution

比较难,不会写,代码都是抄题解的...题解链接

Code

//It is made by Awson on 2018.3.6
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const LL INF = ~0u>>1;
const LL mod5 = 1953125, mod2 = 512; LL a, b, k, mi2, mi5, yzh, K;
LL f[6][mod5+1]; void print(LL x, LL rest) {if (rest == 0) return; print(x/10, rest-1); putchar(x%10+'0'); }
LL quick_pow(LL a, LL b, LL p) {
LL ans = 1;
while (b) {
if (b&1) ans = ans*a%p;
b >>= 1, a = a*a%p;
}
return ans;
}
void ex_gcd(LL a, LL b, LL &x, LL &y) {
if (b == 0) {x = 1, y = 0; return; }
ex_gcd(b, a%b, x, y);
LL t = x; x = y; y = t-a/b*y;
}
LL inv(LL a, LL b) {
LL x, y; ex_gcd(a, b, x, y);
return (x%b+b)%b;
}
LL mul(LL n, LL pi, LL pk) {
if (n == 0) return 1;
LL ans = f[pi][pk]%pk;
ans = quick_pow(ans, n/pk, pk);
ans = ans*f[pi][n%pk]%pk;
return ans*mul(n/pi, pi, pk)%pk;
}
LL C(LL n, LL m, LL pi, LL pk, bool flag) {
LL k = 0;
for (LL i = n; i; i = i/pi) k += i/pi;
for (LL i = m; i; i = i/pi) k -= i/pi;
for (LL i = n-m; i; i = i/pi) k-= i/pi;
if (pi == 2 && !flag) --k; if (k >= K) return 0;
LL a = mul(n, pi, pk), b = mul(m, pi, pk), c = mul(n-m, pi, pk);
LL ans = a*inv(b, pk)%pk*inv(c, pk)%pk*quick_pow(pi, k, pk)%pk;
if (pi == 5 && !flag) ans = ans*inv(2, pk)%pk;
return ans;
}
LL ex_lucas(LL n, LL m, bool flag) {return (C(n, m, 2, mi2, flag)*mi5%yzh*inv(mi5, mi2)%yzh+C(n, m, 5, mi5, flag)*mi2%yzh*inv(mi2, mi5)%yzh+yzh)%yzh; }
void work() {
K = k; mi2 = quick_pow(2, k, INF), mi5 = quick_pow(5, k, INF), yzh = mi2*mi5;
if (a == b) print((quick_pow(2, a*2-1, yzh)-ex_lucas(a*2, a, 0)+yzh)%yzh, k), puts("");
else {
LL ans = quick_pow(2, a+b-1, yzh);
for (LL i = (a+b)/2+1; i < a; i++) ans = (ans+ex_lucas(a+b, i, 1))%yzh;
if ((a+b)%2 == 0) ans = (ans+ex_lucas(a+b, (a+b)/2, 0))%yzh;
print(ans, k), puts("");
}
}
int main() {
f[2][0] = f[5][0] = f[2][1] = f[5][1] = 1;
for (LL i = 2; i <= mod2; i++) f[2][i] = (f[2][i-1])*(i%2 == 0 ? 1 : i)%mod2;
for (LL i = 2; i <= mod5; i++) f[5][i] = (f[5][i-1])*(i%5 == 0 ? 1 : i)%mod5;
while (~scanf("%lld%lld%lld", &a, &b, &k)) work(); return 0;
}

[HNOI 2017]抛硬币的更多相关文章

  1. 模拟抛硬币(C语言实现)

    实现代码: #include<stdio.h> #include<stdlib.h> int heads() { ; } int main(int argc, char *ar ...

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

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

  3. bzoj 4830: [Hnoi2017]抛硬币

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

  4. [AH/HNOI2017]抛硬币

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

  5. bzoj4830 hnoi2017 抛硬币

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

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

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

  7. GMA Round 1 抛硬币

    传送门 抛硬币 扔一个硬币,正面概率为0.6.扔这枚硬币666次,正面就得3分,反面就得1分,求总分的方差. 直接套公式$np(1-p)*(X-Y)^2=666*0.6*(1-0.6)*(3-1)^2 ...

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

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

  9. CSUOJ 1009 抛硬币

    Description James得到了一堆有趣的硬币,于是决定用这些硬币跟朋友们玩个小游戏.在一个N行M列的表格上,每一个第i行第j列的格子上都放有一枚James的硬币,抛该硬币正面朝上的概率为Pi ...

随机推荐

  1. 【LATEX】个人版latex论文模板

    以下是我的个人论文模板,运行环境为Xelatex(在线ide:Sharelatex.com) 鉴于本人常有插入程序的需求,故引用了lstlisting \RequirePackage{ifxetex} ...

  2. 如何在http请求中使用线程池(干货)

    这段时间对网络爬虫比较感兴趣,实现起来实际上比较简单.无非就是http的web请求,然后对返回的html内容进行内容筛选.本文的重点不在于这里,而在于多线程做http请求.例如我要实现如下场景:我有N ...

  3. 第二次作业之微信小程序

    2.1 介绍产品相关信息 你选择的产品是? 微信小程序 为什么选择该产品作为分析? 在等待了1年多以后,小程序终于在今年初上线,即速应用在H5领域的累计,便承接在小程序上.8月7日,即速应用的用户微信 ...

  4. Linux学习--线程概念

    线程 我们知道 ,进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,本节我们学习如何在一个进程的地址空间中执行多个线程.有些情况需要在一个进程中同时执行多个控制流程,这 ...

  5. Node入门教程(7)第五章:node 模块化(下) npm与yarn详解

    Node的包管理器 JavaScript缺少包结构的定义,而CommonJS定义了一系列的规范.而NPM的出现则是为了在CommonJS规范的基础上,实现解决包的安装卸载,依赖管理,版本管理等问题. ...

  6. B+树介绍

    B+树 B+树和二叉树.平衡二叉树一样,都是经典的数据结构.B+树由B树和索引顺序访问方法(ISAM,是不是很熟悉?对,这也是MyISAM引擎最初参考的数据结构)演化而来,但是在实际使用过程中几乎已经 ...

  7. 使用pie.htc时Border-radius的兼容

    如果一个图层中(navin)使用了pie.htc来对ie6,7,8进行兼容,如若上一层(navwrap)的样式中有背景的属性,则此层 (navin) 在ie6,7,8中背景颜色不显示.如下图:此部分的 ...

  8. python __str__ 和__repr__方法

    看下面的例子就明白了 class Test(object): def __init__(self, value='hello, world!'): self.data = value >> ...

  9. hadoop2.7.3+spark2.1.0+scala2.12.1环境搭建(2)安装hadoop

    一.依赖安装 安装JDK 二.文件准备 hadoop-2.7.3.tar.gz 2.2 下载地址 http://hadoop.apache.org/releases.html 三.工具准备 3.1 X ...

  10. django的models模型类的常用数据类型和选项

    django框架的models模块ORM框架,能够让我们通过编写类的方式,帮助我们自动生成数据库表. 生成的数据库表名为 应用模块名称_类名 数据库表中字段名 如果我们没有在参数中指定,就是我们写的类 ...