确实牛逼。。。。。。这个转化我反正肯定想不到。。。

考虑 \(a=b\) 的情况。发现出了平局之外都是一半赢一半输。可以得到此时的答案为:

\[\frac{2^{a+b}-\sum_{i=0}^{a}\binom{a}{i}^2}{2}
\]

后面是范德蒙德卷积,可以得到答案是 \(\frac{2^{a+b}-\binom{2a}{a}}{2}\)。

接下来考虑 \(a\neq b\)。前面的情况相当于是考虑将一个赢的方案和输的方案配对,所以我们考虑这个问题的时候也考虑将赢的方案和输的方案配对。

设能够配对的方案数为 \(q\),不能够配对的方案数为 \(p\),容易发现不能够配对的方案数一定是小 A 能够胜利的方案数。

答案就是 \(p+\frac{q}{2}\)。

只要能够计算出其中一个就可以了。考虑计算不能配对的方案数。

设 \(x\) 为小 A 的方案中硬币朝上的次数,\(y\) 为小 B 的方案中硬币朝上的次数。

如果一个方案不能配对必定满足 \(x>y\) 和 \(a-x>b-y\),即 \(a-b>x-y\)。于是我们可以枚举这个 \(x-y\):

\[\sum_{i=0}^{b}\sum_{j=1}^{a-b-1}\binom{b}{i}\binom{a}{i+j}
\]
\[\sum_{j=1}^{a-b-1}\sum_{i=0}^{b}\binom{b}{b-i}\binom{a}{i+j}
\]
\[\sum_{j=1}^{a-b-1}\binom{a+b}{b+j}
\]
\[\sum_{i=1}^{a-b-1}\binom{a+b}{b+i}
\]

使用 exLucas 计算即可。

需要注意的是最后要除以一个 \(2\),把模数乘上二,最后直接除以一个 \(2\) 即可。

#include<functional>
#include<cstdio>
using std::function;
typedef unsigned ui;
typedef __uint128_t LL;
typedef unsigned long long ull;
const ui pw2[11]={1,2,4,8,16,32,64,128,256,512,1024};
const ui pw5[11]={1,5,25,125,625,3125,15625,78125,390625,1953125,9765625};
const ui pw10[11]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
struct Barrett{
ull m,b;
Barrett(const ui&m=1):m(m),b(((LL(1)<<64)+m-1)/m){}
friend inline ull operator%(const ull&a,const Barrett&mod){
return a-mod.m*(LL(mod.b)*a>>64);
}
};
inline void exgcd(const ui&a,const ui&b,int&x,int&y){
if(!b)return x=1,y=0,void();exgcd(b,a%b,y,x);y-=ui(a/b)*x;
}
inline ui inv(const ui&n,const ui&mod){
int x,y;exgcd(n,mod,x,y);return x<0?x+mod:x>=mod?x-mod:x;
}
inline ui pow(ui a,ull b,const Barrett&mod){
ui ans(1);for(;b;b>>=1,a=1ull*a*a%mod)if(b&1)ans=1ull*ans*a%mod;return ans;
}
inline ui pow(ui a,ull b,const ui mod){
ui ans(1);for(;b;b>>=1,a=1ull*a*a%mod)if(b&1)ans=1ull*ans*a%mod;return ans;
}
struct exLucas{
Barrett p,mod;
ui P,MOD,fac[1953126];
inline void init(const ui&tp,const ui&tmod){
fac[0]=1;p=Barrett(P=tp);mod=Barrett(MOD=tmod);
for(ui i=1,j=1;i<=MOD;++i,++j,j*=j!=P)fac[i]=1ull*fac[i-1]*(j?i:1)%mod;
}
inline ull g(const ull&n){
ull pk(P),ans(0);while(pk<=n)ans+=n/pk,pk*=P;return ans;
}
inline ui f(const ull&n){
return n?1ull*f(n/P)*pow(fac[MOD],n/MOD,mod)%mod*fac[n%mod]%mod:1;
}
inline ui operator()(const ull&n,const ull&m){
ui c=pow(P,g(n)-g(m)-g(n-m),mod);
return c?1ull*f(n)*inv(f(m),MOD)%mod*inv(f(n-m),MOD)%mod*c%mod:0;
}
}C2,C5;
inline ui Solve(const ull&a,const ull&b,const ui&k){
const ui&mod2=pw2[k+1],&mod5=pw5[k],&mod=mod2*mod5;
ui ans(0);C2.init(2,mod2);C5.init(5,mod5);
function<ui(const ull&,const ull&)>
C=[&](const ull&n,const ull&m){
return 1ull*(1ull*C2(n,m)*inv(mod5,mod2)%mod*mod5+1ull*C5(n,m)*inv(mod2,mod5)%mod*mod2)%mod;
};
if(a==b)return(pow(2,a+b,mod)+mod-C(a+b,a))/2%pow(10,k,2e9);
for(ui i=1;i<a-b;++i)ans=(ans+C(a+b,b+i))%mod;
return(pow(2,a+b,mod)+ans)/2%pow(10,k,2e9);
}
inline void write(const ui&n,const ui&k){
for(ui i=k-1;i<k;--i)printf("%u",n/pw10[i]%10);printf("\n");
}
signed main(){
ull a,b;ui k;
while(~scanf("%llu%llu%u",&a,&b,&k))write(Solve(a,b,k),k);
}

LGP3726题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. Java 中使用正则表达式校检IP是否输入正确

    感谢大佬案例:https://www.jb51.net/article/114671.htm 正则表达式学习:(待办)近期总结

  2. SqlServer数据库表生成C# Model实体类SQL语句——补充

    在sql语句最前边加上  use[数据库名] 原链接:https://www.cnblogs.com/jhli/p/11552105.html   --[SQL骚操作]SqlServer数据库表生成C ...

  3. 简单实现支付密码输入框 By HL

    密码输入框在微信,支付宝中比较常见 主要功能点 1.6位(或者N位)密码输入框封装

  4. iOS App程序内多语言国际化实现 By HL

    iOS 多语言设置有很多方式可以实现,之前在做手机思埠1.0时,就对app进行了多语言设置,当时看到很多方法,比如用plist等方式保存键值对的,不过还是用Localisator来国际化最方便 1.添 ...

  5. (4)Canal多实例使用

    1.前言 很多时候,我们很多业务场景可能只需要同步多个或者单个数据库多个或者单个表的数据,canal提供了多实例(Instance)功能让我们可以处理这些业务场景.废话少说,让我们来学习下这块知识点. ...

  6. Solution -「HNOI 2009」「洛谷 P4727」图的同构计数

    \(\mathcal{Description}\)   Link.   求含 \(n\) 个点的无标号简单无向图的个数,答案模 \(997\). \(\mathcal{Solution}\)   首先 ...

  7. Solution -「CF 1060F」Shrinking Tree

    \(\mathcal{Description}\)   Link.   给定一棵 \(n\) 个点的树,反复随机选取一条边,合并其两端两点,新点编号在两端两点等概率选取.问每个点留到最后的概率.    ...

  8. 依赖于angular的table组件

    组件实现了以下功能 1. 列宽可动态拖动 2. 列数据排序 3. 列过滤 4. 列位置自由调整 除了需要引入angular.js(我用的是1.4.6版本),还需要引用一个angular衍生出来的插件n ...

  9. Spring MVC项目快速搭建(编程模型)

    1)配置DispatcherServlet前端控制器(web配置) 2)将xml文件路径告诉Spring MVC(DispatcherServlet) 以上两步等价于继承了WebApplication ...

  10. DDD-领域驱动设计简谈

    看到网上讨论 DDD 的文章越来越多,咱也不能甘于人后啊,以下是我对 DDD 的个人理解,短小精悍,不喜忽喷. 也谈DDD(领域驱动设计) 解决什么问题 传统模式,产品评审结束,开发人员就凭经验拆分模 ...