传送门

这个题的暴力比较好想……然后用一些组合的知识就可以变成正解了。

首先我们考虑a=b的情况。我们把扔出来的硬币看成是一个01序列,那么对于一个b获胜的序列,他在每一位都按位异或1之后必然是一个a获胜的序列,那么a获胜的情况就是总情况减去平局,再除以二。总情况显然是\(2^{a+b}\),平局的我们能想到是\(\sum_{i=0}^a (C_a^i)^2\),这个怎么快速计算……?一会会说到。

之后考虑a > b的情况。现在任何一个a平局或者告负的局面,只要按位异或1之后都会转化为a胜的局面。因为a可以靠抛出硬币的数量取胜,那么首先我们枚举b抛出硬币的情况。之后对于a的情况,a抛出的硬币要比b多,那么我们可以枚举多出来的硬币数,结合起来就是\(\sum_{i=0}^b\sum_{j=1}^{a-b-1} C_b^iC_a^{i+j}\).

这一部分的情况,即使将序列全部异或1,获胜的依然是a。那么这一部分的情况除以2,加上总的情况除以2即为答案。

下面我们用到一个叫范德蒙德恒等式的东西,其形式如下:\(\sum_{i=0}^k C_n^iC_m^{k-i} = C_{n+m}^k\)

这个有两种证明方法。

1.组合证明。

我们考虑从\(n+m\)个元素中选取k个的情况数。我们分成两部分来看,一部分是从前n个里面取i个,一部分是从后面m个取k-i个,这两种之间用乘法原理乘起来。然后我们只要枚举每次取的情况,从0~k,就可以取遍所有情况,等式成立。

2.生成函数证明。(也可以说是数学推导?233)

\((1+x)^n(1+x)^m = (1+x)^{n+m}\)

\((\sum_{i=0}^nC_n^ix^i)(\sum_{i=0}^mC_m^ix^i) = \sum_{k=0}^{n+m}(\sum_{i=0}^kC_n^iC_m^{k-i})x^k\)(后面是卷积的形式)

\((1+x)^{n+m} = \sum_{k=0}^{n+m}C_{n+m}^kx^k\)

把这两个式子比较一下,之后就可以立即得到\(\sum_{i=0}^kC_n^iC_m^{k-i} = C_{n+m}^k\)

这时候我们就可以得到,平局的情况,应该是\(C_{a+b}^a\),而对于a>b时a获胜的情况,我们先把式子变形成这样:\(\sum_{i=1}^{a-b-1}\sum_{j=0}^bC_b^{b-j}C_a^{i+j}\),因为\(b-j+i+j = b+i\),所以式子可以看成\(\sum_{i=1}^{a-b-1}\sum_{j+k = b+i}C_b^jC_a^k\),根据上面的范德蒙德恒等式就可以得到答案为\(\sum_{i=1}^{a-b-1}C_{a+b}^{b+i}\)

然后这时候你兴致冲冲写了扩展卢卡斯发现T成0分。

这个题需要预先处理在模2和5的k次幂下的阶乘,为了方便扩展卢卡斯运算,需要中途把2和5的倍数直接抠掉。还有一个问题是怎么除以2.当a+b为奇数的时候,那么我们算的其实是杨辉三角中间的几列,只算一半就行。a+b为偶数的时候会剩下一项\(C_{a+b}^{(a+b)/2}\),这个我们用组合的知识,\(C_{2a}^a = C_{2a-1}^a+C_{2a-1}^{a-1} = 2C_{2a-1}^a\),计算它就可以了。

#include<bits/stdc++.h>
#define rep(i,a,n) for(ll i = a;i <= n;i++)
#define per(i,n,a) for(ll i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = 2000005;
const int INF = 2147483647;
const double eps = 1e-8; ll read()
{
ll ans = 0,op = 1;char ch = getchar();
while(ch < '0' || ch > '9') {if(ch == '-') op = -1;ch = getchar();}
while(ch >= '0' && ch <= '9') ans = ans * 10 + ch - '0',ch = getchar();
return ans * op;
} ll a,b,k,p,ans,fac[2][M],d1,d2;
ll mul(ll a,ll b,ll t)
{
ll res = a * b - (ll)((long double)a / t * b + eps) * t;
return (res % t + t) % t;
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b){x = 1,y = 0;return a;}
ll d = exgcd(b,a%b,y,x);
y -= a / b * x;
return d;
}
ll inv(ll a,ll b)
{
ll x,y;
exgcd(a,b,x,y);
return (x % b + b) % b;
}
ll CRT(ll b,ll t) {return mul(mul(b,inv(p/t,t),p),p/t,p);}
ll qpow(ll a,ll b,ll t)
{
ll p = 1;
while(b)
{
if(b & 1) p = mul(p,a,t);
a = mul(a,a,t),b >>= 1;
}
return p;
} ll Fac(ll x,ll pi,ll pk)
{
if(!x) return 1;
ll res = fac[pi!=2][pk];
res = mul(qpow(res,x/pk,pk),fac[pi!=2][x%pk],pk);
return mul(res,Fac(x/pi,pi,pk),pk);
} ll C(ll n,ll m,ll pi,ll pk)
{
if(n < m) return 0;
ll r = 0;
for(ll i = n;i;i /= pi) r += i / pi;
for(ll i = m;i;i /= pi) r -= i / pi;
for(ll i = n-m;i;i /= pi) r -= i / pi;
if(r >= k) return 0;//这一句不加会T
ll g = Fac(n,pi,pk),g1= Fac(m,pi,pk),g2 = Fac(n-m,pi,pk);
return mul(mul(g,inv(g1,pk),pk),mul(qpow(pi,r,pk),inv(g2,pk),pk),pk);
} ll exlucas(ll n,ll m)
{
ll res = 0;
res += CRT(C(n,m,2,d1),d1),res %= p;
res += CRT(C(n,m,5,d2),d2),res %= p;
return res;
} void init(ll p,ll pk)
{
fac[p!=2][0] = 1;
rep(i,1,pk) (i%p) ? fac[p!=2][i] = mul(fac[p!=2][i-1],i,pk) : fac[p!=2][i] = fac[p!=2][i-1];
} int main()
{
//freopen("coin1.in","r",stdin);
init(2,512),init(5,1953125);
while(~scanf("%lld%lld%lld",&a,&b,&k))
{
p = qpow(10,k,INF),d1 = qpow(2,k,INF),d2 = qpow(5,k,INF);
ans = qpow(2,a+b-1,p);
if(a == b) ans += (p - exlucas((a<<1)-1,a)),ans %= p;
else
{
rep(i,1,(a-b-1)>>1) ans += exlucas(a+b,b+i),ans %= p;
if(!((a+b)&1)) ans += exlucas(a+b-1,(a+b)>>1),ans %= p;
}
while(ans < p / 10) putchar('0'),p /= 10;
printf("%lld\n",ans);
}
return 0;
}

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

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

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

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

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

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

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

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

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

  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. bzoj 4830: [Hnoi2017]抛硬币

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

  8. [AH/HNOI2017]抛硬币

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

  9. bzoj4830 hnoi2017 抛硬币

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

随机推荐

  1. SSH错误:packet_write_wait: Connection to 10.57.19.250 port 22: Broken pipe

    现象:ssh连接以后,服务器会主动断开连接,wireshark抓包,发线服务器会tcp rst,断开ssh连接 解决尝试:1.修改会话超时时间:2.客户端主动间隔性向服务器发送保活报文:3.服务端主动 ...

  2. [置顶] vue-cli的webpack模板项目配置文件分析

    2017-09-11更新:更新到webpack 2.6.1所对应的配置,完善部分代码注释. 由于最近在vue-cli生成的webpack模板项目的基础上写一个小东西,开发过程中需要改动到build和c ...

  3. SVN服务器配置说明 【转】

    http://www.cnblogs.com/ricksun/articles/1564905.html 1.前 言 花了72小时,终于把 Subversion 初步掌握了.从一个连“什么是版本控制” ...

  4. JavaScript 推断浏览器类型及32位64位

    JS推断出版本号以及浏览器类型 <script type="text/javascript"> var Sys = {}; var ua = navigator.use ...

  5. Naive Bayesian文本分类器

    贝叶斯学习方法中有用性非常高的一种为朴素贝叶斯学习期,常被称为朴素贝叶斯分类器. 在某些领域中与神经网络和决策树学习相当.尽管朴素贝叶斯分类器忽略单词间的依赖关系.即如果全部单词是条件独立的,但朴素贝 ...

  6. iOS7系统中的坑——UITableViewCellScrollView

    今天开完一系列例会后,终于迎来放假的时候了,本来中午就要下班走的,想着火车票现在还很早,也就不急着走,闲着无聊,想着之前要写的内容,索性写一篇聊以打发时光,也希望对其他人有所帮助吧. 现在iOS的最新 ...

  7. android 5.2

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2VyZ2V5Y2Fv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  8. nyoj 135 取石子(二) 【NIM】

    取石子(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 小王喜欢与同事玩一些小游戏.今天他们选择了玩取石子. 游戏规则例如以下:共同拥有N堆石子.已知每堆中石子 ...

  9. Jememeter和Loadrunner测试MySQL性能

    From:http://blog.csdn.net/testingstar/article/details/60579454 MySQL数据库性能测试的方法 前置条件: 安装系统:windows 7 ...

  10. Amazon SNS移动推送更新——新增百度云推送和Windows平台支持

    Amazon SNS(Simple Notification Service)是一种基于云平台的消息通知和推送服务. SNS提供简单的 Web 服务接口和基于浏览器的管理控制台让用户可以简易设置.执行 ...