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. Jupyter Notebook的快捷键

    Jupyter Notebook 有两种键盘输入模式. 编辑模式,允许你往单元中键入代码或文本,这时的单元框线是绿色的. 命令模式,键盘输入运行程序命令:这时的单元框线是蓝色.       命令模式 ...

  2. Java基础学习笔记十三 常用API之正则表达式、Date、DateFormat、Calendar

    正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex).正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配一系列符合某个句法规则的字符串.在 ...

  3. JAVA入门——Generic/泛型

    在台科大的第二次JAVA作业,老师课上讲的内容是泛型. 泛型(generic),泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以 ...

  4. C语言第二次作业

    一.PTA实验作业 题目1:7-1 计算分段函数[2] 1.实验代码 double x,y; scanf("%lf",&x); if (x>=0) { y=sqrt( ...

  5. HDFS之RPC机制

  6. Flask 扩展 表单

    pip install flask-wtf 一个简单的表单 from flask_wtf import Form from wtforms import StringField from wtform ...

  7. 11-TypeScript中的名称空间

    在后端开发语言中,比如C#中,可以将不同源代码文件中的代码通过名称空间组合到一起.一般一个类定义在一个源代码文件中,在功能上属于一个上下文的源代码文件通过名称空间进行组织. 在TypeScript中, ...

  8. LeetCode & Q119-Pascal's Triangle II-Easy

    Description: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3 ...

  9. ORA-00379 缓冲池 DEFAULT 中无法提供 32K 块大小的空闲缓冲区

    (一)问题 今天在使用Pl/sql developer查看表空间大小的时候,报错误:ORA-00379 缓冲池 DEFAULT 中无法提供 32K 块大小的空闲缓冲区,具体如下图: SQL> s ...

  10. Mysql数据库mys和ora库的备份与恢复脚本

    !/bin/bash Time=$(date +%Y%md%H%M%S) Back_dir="$HOME/mysqlback/${Time}" function Detect_u_ ...