bzoj 4830: [Hnoi2017]抛硬币
Description
小A和小B是一对好朋友,他们经常一起愉快的玩耍。最近小B沉迷于**师手游,天天刷本,根本无心搞学习。但是
已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生。勤勉的小A为了劝说小B早日脱坑,认真学习,决
定以抛硬币的形式让小B明白他是一个彻彻底底的非洲人,从而对这个游戏绝望。两个人同时抛b次硬币,如果小A
的正面朝上的次数大于小B正面朝上的次数,则小A获胜。但事实上,小A也曾经沉迷过拉拉游戏,而且他一次UR也
没有抽到过,所以他对于自己的运气也没有太大把握。所以他决定在小B没注意的时候作弊,悄悄地多抛几次硬币
,当然,为了不让小B怀疑,他不会抛太多次。现在小A想问你,在多少种可能的情况下,他能够胜过小B呢?由于
答案可能太大,所以你只需要输出答案在十进制表示下的最后k位即可。
solution
正解:扩展卢卡斯
因为 \(a-b\) 很小,考虑怎么把式子变成和 \(a-b\) 有关.
考虑 \(a=b\) 的情况,考虑结果只有输赢和平局三种,而且输赢是对称的,所以减去平局就是答案,所以答案为 \((2^{a+b}-C(2a,a))/2\).
\(a>b\) 时,同样存在对称性,对于正着会输,反过来就赢得情况,就是 \(2^{a+b}/2\) 种
对于正着反着都赢的情况还没有算进去:
\]
\]
\]
\]
对于除2,根据对称性,只算一半即可,注意偶数情况,存在一项需要手动除2,算2时在因子中减去,算5时直接乘逆元即可
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
const int N=2500005;
ll qm(ll x,ll k,ll MO){
ll sum=1;
while(k){
if(k&1)sum*=x,sum%=MO;
x*=x;x%=MO;k>>=1;
}
return sum;
}
ll v[2][N],mod,K;
void priwork(){
int lim=qm(2,9,N);
v[0][0]=v[1][0]=1;
for(RG int i=1;i<=lim;i++){
v[0][i]=v[0][i-1]*((i&1)?i:1);
v[0][i]%=lim;
}
lim=qm(5,9,N);
for(RG int i=1;i<=lim;i++){
v[1][i]=v[1][i-1]*((i%5)?i:1);
v[1][i]%=lim;
}
}
inline void exgcd(ll a,ll b,ll &x,ll &y){
if(!b)x=1,y=0;
else exgcd(b,a%b,y,x),y-=a/b*x;
}
inline ll ni(ll a,ll b){
ll x,y;
exgcd(a,b,x,y);
x%=b;if(x<0)x+=b;
return x;
}
inline ll Fac(ll n,ll p,ll pr){
if(n==0)return 1;
ll re=v[p!=2][pr]%pr;
re=qm(re,n/pr,pr);
ll r=n%pr;
re=re*v[p!=2][r]%pr;
return re*Fac(n/p,p,pr)%pr;
}
inline ll C(ll n,ll m,ll p,ll pr,bool t){
if(n<m)return 0;
ll c=0;
for(RG ll i=n;i;i/=p)c+=(i/p);
for(RG ll i=m;i;i/=p)c-=(i/p);
for(RG ll i=n-m;i;i/=p)c-=(i/p);
if(t && p==2)c--;
if(c>=K)return 0;
ll x=Fac(n,p,pr),y=Fac(m,p,pr),z=Fac(n-m,p,pr);
ll re=x*ni(y,pr)%pr*ni(z,pr)%pr*qm(p,c,pr)%pr;
if(t && p==5)re=re*ni(2,pr)%pr;
return (mod/pr)*ni(mod/pr,pr)%mod*re%mod;
}
inline ll lucas(ll n,ll m,ll k,bool t){
ll MOD=qm(2,k,N),re=0;
re=(re+C(n,m,2,MOD,t))%mod;
MOD=qm(5,k,N);
re=(re+C(n,m,5,MOD,t))%mod;
return re;
}
ll work(ll n,ll m,ll k)
{
ll ans=0;mod=qm(10,k,1e9+5);
if(n==m)
return ((qm(2,n+m-1,mod)-lucas(n+m,n,k,1))%mod+mod)%mod;
for(ll i=(n+m)/2+1;i<n;i++){
ans+=lucas(n+m,i,k,0);
ans%=mod;
}
if((n+m)%2==0)ans=(ans+lucas(n+m,(n+m)/2,k,1)%mod+mod)%mod;
return (qm(2,n+m-1,mod)+ans)%mod;
}
inline void Print(ll x,ll c){
if(c==1)printf("%lld\n",x);if(c==2)printf("%02lld\n",x);
if(c==3)printf("%03lld\n",x);if(c==4)printf("%04lld\n",x);
if(c==5)printf("%05lld\n",x);if(c==6)printf("%06lld\n",x);
if(c==7)printf("%07lld\n",x);if(c==8)printf("%08lld\n",x);
if(c==9)printf("%09lld\n",x);
}
int main()
{
priwork();
ll a,b,c,d;
while(~scanf("%lld%lld%lld",&a,&b,&c)){
K=c;d=work(a,b,c);
Print(d,c);
}
return 0;
}
bzoj 4830: [Hnoi2017]抛硬币的更多相关文章
- bzoj 4830: [Hnoi2017]抛硬币 [范德蒙德卷积 扩展lucas]
4830: [Hnoi2017]抛硬币 题意:A投a次硬币,B投b次硬币,a比b正面朝上次数多的方案数,模\(10^k\). \(b \le a \le b+10000 \le 10^{15}, k ...
- 【刷题】BZOJ 4830 [Hnoi2017]抛硬币
Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A为 ...
- 【BZOJ4830】[HNOI2017]抛硬币(组合计数,拓展卢卡斯定理)
[BZOJ4830][HNOI2017]抛硬币(组合计数,拓展卢卡斯定理) 题面 BZOJ 洛谷 题解 暴力是啥? 枚举\(A\)的次数和\(B\)的次数,然后直接组合数算就好了:\(\display ...
- [AH/HNOI2017]抛硬币
题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生.勤勉的小 A ...
- bzoj4830 hnoi2017 抛硬币
题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生.勤勉的小 A ...
- luogu P3726 [AH2017/HNOI2017]抛硬币
传送门 我是真的弱,看题解都写了半天,,, 这题答案应该是\(\sum_{i=1}^{a}\binom{a}{i}\sum_{j=0}^{min(b,i-1)}\binom{b}{j}\) 上面那个式 ...
- [HNOI2017]抛硬币
Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于××师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A为 ...
- [luogu3726 HNOI2017] 抛硬币 (拓展lucas)
传送门 数学真的太优秀了Orz 数据真的太优秀了Orz 题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月, ...
- [AH2017/HNOI2017]抛硬币(扩展lucas)
推式子+exlucas. 题意: 小 A 和小 B 是一对好朋友,两个人同时抛 b 次硬币,如果小 A 的正面朝上的次数大于小 B 正面朝上的次数,则小 A 获胜. 小 A 决定在小 B 没注意的时候 ...
随机推荐
- 从零部署Spring boot项目到云服务器(正式部署)
上一篇文章总结了在Linux云服务器上部署Spring Boot项目的准备过程,包括环境的安装配置,项目的打包上传等. 链接在这里:http://www.cnblogs.com/Lovebugs/p/ ...
- c语言——第0次作业
1.你认为大学的学习生活.同学关系.师生应该是怎样?请一个个展开描写 大学生活:大学生活充满着挑战,首先当然必须先掌握自己所学的专业知识,然后就要学会独立,可以处理好人际关系,并且要有更强的自我约束能 ...
- MyGod_alpha版本测试报告
买尬-Alpha版本测试报告 @(二手市场APP)[MyGod团队|团队项目|版本测试] 项目名称:武汉大学校园二手市场APP--买尬 软件版本:1.0.0 开发团队:MyGod 开发代表:程环宇 张 ...
- HTML5文件操作API
HTML5文件操作API 一.文件操作API 在之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台.或 ...
- Hibernate之深入Hibernate的配置文件
1.创建Configuration类的对象 Configuration类的对象代表了应用程序到SQL数据库的映射配置.Configuration类的实例对象,提供一个buildSessionFacto ...
- jwt验证登录信息
为什么要告别session?有这样一个场景,系统的数据量达到千万级,需要几台服务器部署,当一个用户在其中一台服务器登录后,用session保存其登录信息,其他服务器怎么知道该用户登录了?(单点登录), ...
- emqtt 试用(五)emq 的用户密码认证
MQTT 认证设置 EMQ 消息服务器认证由一系列认证插件(Plugin)提供,系统支持按用户名密码.ClientID 或匿名认证. 系统默认开启匿名认证(anonymous),通过加载认证插件可开启 ...
- SpringCloud的Bus(一)消息中间件的概念和用途
一.概念与定义 1.Message Broker Message Broker是一种消息验证.消息转换.消息路由的架构模式,用于如: 消息路由到一个或多个目的地 消息转化为其他的表现方式 执行消息的聚 ...
- LayUI之table数据表格获取行、行高亮等相关操作
前言 目前LayUI数据表格既美观有不乏一些实用功能.基本上表格应有的操作已经具备,LayUI作者[贤心]肯定是煞费苦心去优化,此处致敬.但是实话实话,如果单纯那数据表格功能来说,EasUI的数据表格 ...
- Python 爬虫基础知识
requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作, ...