传送门

我是真的弱,看题解都写了半天,,,

这题答案应该是\(\sum_{i=1}^{a}\binom{a}{i}\sum_{j=0}^{min(b,i-1)}\binom{b}{j}\)

上面那个式子无法化简qwq

把A和b的抛硬币情况连在一起,记成一个01串,那么如果某个串代表B获胜,那么这个串的反串就能代表A获胜

如果\(a=b\),那么答案还要减去平局情况,即$$\frac{2^{a+b}-\binom{a+b}{a}}{2}$$

如果\(a>b\),那么有种特殊情况是代表A获胜的某个串反串还是代表A获胜,这种情况假设B硬币朝上个数为\(i\),A的朝上个数比B多\(i\),那么有\(b-i<a-i-j\),情况数量有$$\sum_{i=0}{b}\sum_{j=1}{a-b-1}\binom{a}{i+j}\binom{b}{i}$$个,也就是$$\sum_{i=0}{b}\sum_{j=1}{a-b-1}\binom{a}{i+j}\binom{b}{b-i}$$然后有个什么范德蒙德卷积,就是\(\sum_{i+j=k}\binom{a}{i}\binom{b}{j}=\binom{a+b}{k}\),所以上式化简为$$\sum_{i=1}^{a-b-1}\binom{a+b}{b+i}$$

答案即$$\frac{2{a+b}+\sum_{i=1}{a-b-1}\binom{a+b}{b+i}}{2}$$

然后因为模数不为质数,所以组合数要用\(exlucas\)求

注意在实现的时候要优化时间复杂度,例如预处理模2和模5的阶乘等

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double using namespace std;
il LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
LL a,b,k,K,k2,k5;
LL fc[2][2000000];
int pm[30][2],tt;
il LL fpow(LL a,LL b,LL mod)
{
LL an=1;
while(b){if(b&1) an=an*a%mod;a=a*a%mod,b>>=1;}
return an;
}
il void exgcd(LL a,LL b,LL &x,LL &y)
{
if(!b) {x=1,y=0;return;}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
il LL ginv(LL a,LL b)
{
LL x,y;
exgcd(a,b,x,y);
return (x%b+b)%b;
}
il LL fac(LL n,LL p1,LL pk)
{
if(n<=1) return 1;
LL an=fpow(fc[p1&1][pk],n/pk,pk)*fc[p1&1][n%pk]%pk;
return an*fac(n/p1,p1,pk)%pk;
}
il LL C(LL n,LL m,LL p1,LL pk,bool d2)
{
LL kk=0;
for(LL i=n;i;i/=p1) kk+=i/p1;
for(LL i=m;i;i/=p1) kk-=i/p1;
for(LL i=n-m;i;i/=p1) kk-=i/p1;
if(kk-1>=k) return 0; //kk-1>=k,所以a*p^kk=0(mod p^k)
if(d2)
{
if(p1&1) kk=fpow(p1,kk,pk)*ginv(2,pk)%pk;
else kk=fpow(p1,kk-1,pk);
}
else kk=fpow(p1,kk,pk);
return fac(n,p1,pk)*ginv(fac(m,p1,pk),pk)%pk*ginv(fac(n-m,p1,pk),pk)%pk*kk%pk;
}
il LL exlcs(LL n,LL m,bool d2)
{
return (C(n,m,2,k2,d2)*k5%K*ginv(k5,k2)%K+C(n,m,5,k5,d2)*k2%K*ginv(k2,k5)%K)%K;
}
il void init(int a,int b)
{
int px=a&1;
fc[px][0]=1;
for(int i=1;i<=b;++i)
{
fc[px][i]=fc[px][i-1];
if(i%a) fc[px][i]=fc[px][i]*i%b;
}
} //预处理fac函数中的计算部分
il void print(int x,int kk)
{
kk/=10;
while(kk) putchar(x/kk%10+'0'),kk/=10;
putchar('\n');
} int main()
{
init(2,512),init(5,1953125);
while(scanf("%lld%lld%lld",&a,&b,&k)!=-1)
{
K=k2=k5=1;
int kb=k;while(kb--) K*=10,k2*=2,k5*=5;
if(a==b) print((fpow(2,a+b-1,K)-exlcs(a+b,a,1)+K)%K,K);
else
{
LL an=fpow(2,a+b-1,K);
for(LL i=b+1;i<=(a+b)/2;++i)
an=(an+exlcs(a+b,i,0)%K)%K; //根据C(a,b)=C(a,a-b)省去一半计算
if(!((a+b)&1)) an=(an-exlcs(a+b,(a+b)/2,1)+K)%K;
print(an,K);
}
}
return 0;
}

luogu P3726 [AH2017/HNOI2017]抛硬币的更多相关文章

  1. 洛谷P3726 [AH2017/HNOI2017]抛硬币(组合数+扩展Lucas)

    题面 传送门 题解 果然--扩展\(Lucas\)学了跟没学一样-- 我们先考虑\(a=b\)的情况,这种情况下每一个\(A\)胜的方案中\(A\)和\(B\)的所有位上一起取反一定是一个\(A\)败 ...

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

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

  3. 题解 洛谷 P3726 【[AH2017/HNOI2017]抛硬币】

    可以分别枚举两人正面朝上的次数来统计答案,所求即为 \[\sum_{i=0}^{a}\sum_{j=0}^{b} \binom{a}{i} \binom{b}{j} [i>j] \] 将\(i\ ...

  4. [AH2017/HNOI2017]抛硬币

    传送门 这个题的暴力比较好想--然后用一些组合的知识就可以变成正解了. 首先我们考虑a=b的情况.我们把扔出来的硬币看成是一个01序列,那么对于一个b获胜的序列,他在每一位都按位异或1之后必然是一个a ...

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

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

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

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

  7. [Luogu P3723] [AH2017/HNOI2017]礼物 (FFT 卷积)

    题面 传送门:洛咕 Solution 调得我头大,我好菜啊 好吧,我们来颓柿子吧: 我们可以只旋转其中一个手环.对于亮度的问题,因为可以在两个串上增加亮度,我们也可以看做是可以为负数的. 所以说,我们 ...

  8. bzoj 4830: [Hnoi2017]抛硬币

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

  9. [AH/HNOI2017]抛硬币

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

随机推荐

  1. empty() 与 html("") 的区别

    empty,首先循环给后代元素移除绑定.清除jquery给此dom的cache,然后循环removeFirstChild. 而html(''),则是简单暴力的设置innerHTML = ''; 查看文 ...

  2. bzoj3238 差异

    题目链接 思路 观察题目中的式子,可以发现前两项是定值.所以只需要求出最后一项就行了. 然后题目就转化为了求字符串中所有后缀的\(lcp\)长度之和. 可以想到用后缀数组.在后缀数组上两个后缀的\(l ...

  3. 【译】10. Java反射——数组

    原文地址:http://tutorials.jenkov.com/java-reflection/arrays.html ======================================= ...

  4. cookie猜数字游戏(上)---------------思路分析(踩坑)

    说明:用户第一次请求页面的时候,同时会产生一个随机数,用户点提交表单的时候,会将输入的数字与第一次请求产生的数字进行一个对比. 问题一:如何保存用户每次提交的数据 我们常见的在服务器中保存数据的方式是 ...

  5. python自动化开发-[第十一天]-Mysql

    今日概要: 1.初识mysql 2.MySQL的增删改查 3.主键.外键 4.组合和分组 一.数据库的由来 1.什么是数据库? 数据的仓库,在ATM,购物车中存储数据为目录,称为数据库 1.数据以表格 ...

  6. 记录一次php连接mssql的配置

    记录一次php连接mssql的配置 在现有php环境中,php连接mssql数据库失败,tsql 连接正常. 确认问题在php环境上. 网上有个同仁总结的很好,https://blog.csdn.ne ...

  7. PL/SQL Developer连接本地Oracle 11g 64位数据库和快捷键设置

    1.登录PL/SQL Developer 这里省略Oracle数据库和PL/SQL Developer的安装步骤,注意在安装PL/SQL Developer软件时,不要安装在Program Files ...

  8. spring-data-redis集成ehcache实现缓存

    1.结构 2.pom.xml <?xml version="1.0" encoding="UTF-8"?><project xmlns=&qu ...

  9. springBoot的事物管理

    springBoot的事物管理 1:springBoot 整合单数据源事物: Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务 ...

  10. springBoot整合多数据源

    springBoot整合相关 1:springBoot整合多数据源: 应用场景:     项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台写库,多台读库. 工具/版本: jdk1. ...