传送门

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

这题答案应该是\(\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. A1076. Forwards on Weibo

    Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may ...

  2. C#串口通信:2自动连接

    上次说到了协议的大致结构,这次我们来说说怎么去实现制动连接串口(当你把设备连上来之后,怎么去让软件自动去识别是否为目标设备,当然这需要上位机与下位机共同完成,这里我们只讨论上位机部分)先上协议: 帧头 ...

  3. Vue学习(4)

    昨天内容回顾 1.{{}}模板语法.插值.简单运算2.指令系统 v-if 真正销毁重建 v-show 更改css的display,用于重复切换出现 v-bind 绑定属性 : v-on 绑定事件 @ ...

  4. django模板中使用JQ代码实现瀑布流显示效果

    settings中的配置不再详细说明 一.路由代码 from django.contrib import admin from django.conf.urls import url from app ...

  5. Linux系统调用之内存管理

    brk 改变数据段空间的分配 sbrk 参见brk mlock 内存页面加锁 munlock 内存页面解锁 mlockall 调用进程所有内存页面加锁 munlockall 调用进程所有内存页面解锁 ...

  6. Git学习笔记——搭建远程仓库

    有空再把笔记移上来 注意点:git remote add origin不是相对于所有git仓库,只相对于当前git仓库 心得:远程建立裸仓库,意味着我不应该直接操作远程仓库.如果我是管理员,我应该先p ...

  7. JQERY EasyUI Tabs 选项卡 自适应浏览器宽度高度 解决方案

    <script type="text/javascript"> $(window).resize(function () { $('#tt').tabs({ width ...

  8. 好用的漂浮广告 jquery

    <script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.js" type="text/javascript ...

  9. parallels tools 安装

    │ - kernel-devel-2.6.32-358.el6.x86_64 │ │ - dkms

  10. (暴力求解)Encoding HDU1020

    Encoding 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1020 Time Limit: 2000/1000 MS (Java/Others)    ...