暂无链接

B君的第一题

【问题描述】

天台上的朋友让一让,让我先来。

世界杯开始了,B 君最近在关注一局季后赛。

在这局季后赛中,甲队和乙队将会进行至多 2n−12n−12n-1 场比赛,谁先取得 nnn 场胜利,谁便会获得最终的胜利。并且之后的比赛不会继续进行。

B 君很看好甲队,为了计算方便,B 君希望下注 22n−1" role="presentation" style="position: relative;">22n−122n−12^{2n-1} 元,也就是说, 如果最终甲队先取得了nn n 场胜利,B 君就会获得 22n−1" role="presentation" style="position: relative;">22n−122n−12^{2n-1} 元。如果最终乙队先取得了nn n 场胜利,B 君就会失去 22n−1" role="presentation" style="position: relative;">22n−122n−12^{2n-1} 元。

但是事不如人愿,甲队和乙队水平旗鼓相当,每一场比赛,双方胜利的概率都是0.50.50.5,并且所有比赛的结果相互独立。

B 君对此坦然接受,认为自己获得 22n−122n−12^{2n-1} 元的概率是 0.50.50.5,失去22n−122n−1 2^{2n-1} 元的概率是 0.50.50.5, 期望收益是 000。

但是赌场的庄家并不允许这样做,必须每一场比赛单独下注,分别进行结算。

B 君很失望,但是他发现,存在唯一一种下注方式,达到自己最初的目的。

即如果最终甲队获胜,B 君各场的收益之和为 22n−1" role="presentation" style="position: relative;">22n−122n−12^{2n-1},如果最终乙队获胜,B 君各场收益之和为−22n−1−22n−1-2^{2n-1}。

比如对于n=2n=2n=2 来说,B 君可以选择在第一场下注44 4 元,在第二场下注 444 元,在第三场下注8" role="presentation" style="position: relative;">88 8 元。

这样如果甲队或乙队赢了前两场,B 君直接获得或失去了88 8 元。

如果前两场甲乙一胜一负,那么 B 君不赔不赚,决胜局下注 8" role="presentation" style="position: relative;">888 元。

也就是说,无论甲以什么方式获胜,B 君都会获得 888 元。无论乙以什么方式获胜, B 君都会失去8" role="presentation" style="position: relative;">88 8 元。

特别的,B 君可以在看到前ii i 场的结果之后,再给出第 i+1" role="presentation" style="position: relative;">i+1i+1i+1 场的下注,而不需要一 开始就给出所有场的下注情况。

对于输入输出,B 君会先告诉你nn n,然后你来告诉B 君第一场比赛应该如何下注, 接下来 B 君告诉你第一场的结果。

你来告诉 B 君第二场比赛应该如何下注,依次类推。如果 B 君告诉你的结果已经导致了甲队或者乙队取得了 n" role="presentation" style="position: relative;">nnn 场胜利。

你不需要对这次结果做任何回复。

因此你输出的数字个数,和B 君告诉你比赛结果的个数相同。

你可以下注负数,表示下注乙队获胜,这样如果甲队失败便可获得回报。

这并不是一个交互题,每个回答的答案是唯一的。
【输入格式】

第一行一个数字 nnn,即上文中所描述的n" role="presentation" style="position: relative;">nnn。

第二行是一些00 0 和 1" role="presentation" style="position: relative;">111,如果是00 0 表示甲队获胜,1" role="presentation" style="position: relative;">111表示乙队获胜。

保证这是一个合法的比赛过程,也就是说,当出现 000 的个数或 1" role="presentation" style="position: relative;">111 的个数达到nnn 个之后, 便不会有更多输入了。

【输出格式】

输出若干个数字,一行一个。个数和输入的第二行数字个数相同,表示每场比赛的下注。

由于下注可能很大,你只需要输出模1000000007" role="presentation" style="position: relative;">100000000710000000071000000007的结果即可。

即使想下注负数,也应该输出取模后的正余数。

可以证明下注的金额一定是整数。

可以证明解是唯一的。

【输入样例】

3
1 1 0 0 1

【输出样例】

12
12
8
16
32

【样例说明】

显然所有下注的和,要么是+22n−1+22n−1+2^{2n-1},要么是−22n−1−22n−1-2^{2n-1}。

对于这场(−12)+(−12)+(8)+(16)+(−32)=−32=−25(−12)+(−12)+(8)+(16)+(−32)=−32=−25(-12) + (-12) + (8) + (16) + (-32) = -32 = -2^5

【输入样例】

3
0 1 0 0

【输出样例】

12
12
16
16

【样例说明】

(12)+(−12)+(16)+(16)=32=25(12)+(−12)+(16)+(16)=32=25 (12) + (-12) + (16) + (16) = 32 = 2^5

你可以根据前两场的结果,来动态的决定第三场的下注。

输入的第二行长度并不确定,当输入nnn个0" role="presentation" style="position: relative;">000或nnn个1" role="presentation" style="position: relative;">111时结束。

【数据范围】

对于100%100%100\%的数据,满足1≤n≤1000001≤n≤1000001 ≤ n ≤ 100000。

对于70%70%70\%的数据,满足1≤n≤10001≤n≤10001 ≤ n ≤ 1000。

对于30%30%30\%的数据,满足1≤n≤61≤n≤61 ≤ n ≤ 6。

数据非常有梯度。

题解

以为数据有梯度是区分度很高的意思,部分分有就有,没有就没有,不存在强行造档的情况,所以考场代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{freopen("beijing.in","r",stdin);freopen("beijing.out","w",stdout);while(1)puts("sh*t");
}

然而出题人居然良心发现,“梯度”的意思居然是n=1,2,3n=1,2,3n=1,2,3都有!,根据题目打个1,2,31,2,31,2,3的表都有151515分,令人窒息的操作。。。

唉,我dpdpdp还是太菜了,O(n2)O(n2)O(n^2)的dpdpdp都想不出来。。。

先考虑O(n2)O(n2)O(n^2)的dpdpdp吧,我们可以算算甲乙两队赢的概率,设dp[i][j]dp[i][j]dp[i][j]为甲队胜iii场,乙队胜j" role="presentation" style="position: relative;">jjj场时,甲队取得最终胜利的概率,那么就有dp[i][j]=dp[i+1][j]+dp[i][j+1]2dp[i][j]=dp[i+1][j]+dp[i][j+1]2dp[i][j]=\frac{dp[i+1][j]+dp[i][j+1]}{2},即dp[i+1][j]−dp[i][j]=dp[i][j]−dp[i][j+1]dp[i+1][j]−dp[i][j]=dp[i][j]−dp[i][j+1]dp[i+1][j]-dp[i][j]=dp[i][j]-dp[i][j+1],所以无论输赢,甲队的胜率变化是一样的。

初始情况dp[0][0]dp[0][0]dp[0][0]胜率为1212\frac{1}{2},末状态为000或1" role="presentation" style="position: relative;">111,收益为−22n−1−22n−1-2^{2n-1}或22n−122n−12^{2n-1},胜率每变化1212\frac{1}{2},收益变化22n−122n−12^{2n-1},那么对于一次变化ΔxΔx\Delta x,我们就应该应该下注Δx1222n−1=2Δx×22n−1Δx1222n−1=2Δx×22n−1\frac{\Delta x}{\frac{1}{2}}2^{2n-1}=2\Delta x\times 2^{2n-1}元。

然后我们就有了一个优秀的O(n2)dpO(n2)dpO(n^2)dp做法。

其实,获胜概率还可以用组合数算出来,考虑当甲队赢了iii场,乙队赢了j" role="presentation" style="position: relative;">jjj场时,对于剩下的res=2n−1−i−jres=2n−1−i−jres=2n-1-i-j场比赛,如果甲队取得了n−in−in-i或更多的场的胜利,就能获胜,所以甲队的胜率可以表示如下:

∑resk=n−i(resk)2res∑k=n−ires(resk)2res

\frac{\sum_{k=n-i}^{res}\binom {res}{k}}{2^{res}}

组合意义很明显,赢得n−i∼resn−i∼resn-i\sim res场的情况比上所有情况。

似乎还是无从下手,考虑我们dpdpdp的思路,如果甲队多赢了一场,胜率将变为:

∑2n−2−i−jk=n−i−1(2n−2−i−jk)22n−2−i−j∑k=n−i−12n−2−i−j(2n−2−i−jk)22n−2−i−j

\frac{\sum_{k=n-i-1}^{2n-2-i-j}\binom{2n-2-i-j}{k}}{2^{2n-2-i-j}}

如果乙队赢了:

∑2n−2−i−jk=n−i(2n−2−i−jk)22n−2−i−j∑k=n−i2n−2−i−j(2n−2−i−jk)22n−2−i−j

\frac{\sum_{k=n-i}^{2n-2-i-j}\binom{2n-2-i-j}{k}}{2^{2n-2-i-j}}

发现这两个式子的差只有一项:

(2n−2−i−jn−i−1)22n−2−i−j(2n−2−i−jn−i−1)22n−2−i−j

\frac{\binom{2n-2-i-j}{n-i-1}}{2^{2n-2-i-j}}

代入dpdpdp得到的结论中,可知我们应下注:

(2n−2−i−jn−i−1)22n−2−i−j×22n−1=21+i+j(2n−2−i−jn−i−1)(2n−2−i−jn−i−1)22n−2−i−j×22n−1=21+i+j(2n−2−i−jn−i−1)

\frac{\binom{2n-2-i-j}{n-i-1}}{2^{2n-2-i-j}}\times 2^{2n-1}=2^{1+i+j}\binom{2n-2-i-j}{n-i-1}

可以预处理组合数,也可以一乘一除得到下一项,复杂度O(n)O(n)O(n)。

代码
#include<cstdio>
#define ll long long
using namespace std;
const int M=2e5+5,mod=1e9+7;
int inv[M],x,y,n,p;
ll C(int a,int b){ll ans=1;for(int i=0;i<b;++i)ans=ans*(a-i)%mod*inv[i+1]%mod;return ans;}
void in(){scanf("%d",&n);}
void ac()
{inv[1]=1;for(int i=2;i<=n+n;++i)inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod;x=y=n;ll ans=C(x+y-2,x-1)*2%mod;while(x>0&&y>0){printf("%lld\n",ans);scanf("%d",&p);ans=ans*2*inv[x+y-2]%mod;if(p)ans=ans*--y%mod;else ans=ans*--x%mod;}
}
int main(){in();ac();}

[2018.07.12 T1]B君的第一题相关推荐

  1. 网吧服务器全部进不了系统,2018.07.12某网吧因为服务器系统盘健康度导致全体卡死重启的故障分析处理过程...

    原标题:2018.07.12某网吧因为服务器系统盘健康度导致全体卡死重启的故障分析处理过程 导读: 天晚上20:54接到某网吧电话,说整个网吧大部分电脑自动重启了,而且进不去系统了.立即用电脑远程登录 ...

  2. 人大网院计算机在线考试答案,2018年12月计算机二级MSOffice操作题及参考答案

    [导语]2018年12月计算机二级考试在即,为了方便广大考生及时获取相关备考资料,下面无忧考网为您精心整理了,希望广大考生及时关注,更多计算机二级考试的相关资讯,请关注无忧考网计算机等级考试频道. 1 ...

  3. 这台计算机现在在博物馆吗英语翻译,2018年12月英语六级翻译真题及答案:博物馆...

    2018年12月英语六级翻译真题及答案:博物馆 2018-12-29 10:47:29 来源:华图教育 2018年12月英语六级翻译真题及答案:博物馆 2018年12月大学英语六级考试已经结束了,各位 ...

  4. 嵌入式 Linux 开发工具篇问题整理//C语言测试(杨辉三角、递归调用实现阶乘、计算器、统计字符串出现次数)//2018.07.12.//

    嵌入式 Linux 开发工具篇问题整理 1. 嵌入式开发与传统开发的区别?(同类问题:单片机开发与嵌入式开发的区别)             是否有无操作系统:     2. 移植操作系统的好处有哪些 ...

  5. 这台计算机现在在博物馆吗英语翻译,2018年12月英语六级翻译真题点评试卷二:博物馆(文都教育)...

    2018年12月大学英语六级翻译有关博物馆的考题一共包含8句话,接下来我们将从逻辑和词汇两个层面帮助大家解析. 一.逻辑层面 拿到题目后,广大考生首先要做的第一件事便是标序号,理大意."理大 ...

  6. 2018.07.12【2018提高组】模拟B组 【NOIP2015模拟10.27】魔法阵

    #Description 帕秋莉·诺蕾姬,有着"不动的大图书馆" 的称号,擅长使用各种各样的属性魔法. --<东方求闻史记> 一如既往地,帕秋莉在图书馆中研究着魔法.今 ...

  7. 2018.07.12【2018提高组】模拟B组 【NOIP2015模拟10.27】魔道研究

    #Description "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力." --<The Grimoire of Ma ...

  8. 2018年12月计算机一级试题答案,2018年12月计算机一级MSOffice冲刺题及答案(7)

    [1] 下列不是微机总线的是( ).[参考答案C] [A] 数据总线 [B] 地址总线 [C] 信息总线 [D] 控制总线 [2] 下列各进制数中最大的数是( ).[参考答案D] [A] 227O [ ...

  9. 2018年12月计算机二级C语言题库,2016年12月计算机二级《C语言》选择题题库

    2016年12月计算机二级<C语言>选择题题库 (1)设栈的存储空间为S(1:m),初始状态为top=m+1.经过一系列入栈与退栈操作后,top=1.现又要将一个元素进栈,栈顶指针t叩值变 ...

  10. 2.12日递推专题第一题

    1.公式推导:2 ^ n - 1 2.注意:①.开到 long long型 ②.不建议用pow 附代码↓↓↓: #include<bits/stdc++.h> using namespac ...

最新文章

  1. php记录网站访问,PHP简单实现记录网站访问量的功能
  2. 庄家如何用计算机下单,新人必看!庄家透露坐庄下单要诀
  3. python作业6月14日
  4. 计算机图形学二维变换知识点,计算机图形学 二维变换及二维.ppt
  5. 银行招聘网计算机类笔试,中国人民银行计算机类笔试模拟题
  6. SpringBoot+Vue表单文件上传
  7. dubbo源码解析-spi(二)
  8. 虚函数 动态绑定 实现方式是:虚函数表
  9. 微软安全软件_微软在GitHub上发布了一个供内部使用的Linux发行版
  10. oracle数据库应用中实现汉字“同音”查询
  11. 微信小程序上传头像,使用wx.chooseImage; wx.uploadFile
  12. 机器码、序列号、认证码、注册码的生成算法(四)
  13. 移动网络怎么修改服务器地址,移动宽带怎么修改wifi密码?
  14. Unity模拟科学计算器
  15. 从零搭建个人资讯系统1
  16. 泛零售数据中台建设之灵魂问答 | 奇点云CEO行在直播回顾
  17. JVM内存管理及垃圾回收
  18. Python自动化修改word实例
  19. 品牌营销策略:适合初创公司的5种营销方式
  20. 纷享销客高燕:回归第一性原理,B2B企业如何向精益化要增长

热门文章

  1. MATLAB 生成随机数
  2. Power Strings POJ - 2406,字符串hash
  3. python map函数filter函数 day16
  4. lucene中文分词搜索的核心代码
  5. Python练习-一辆购物车的寂寞都是Alex的错
  6. BZOJ 1011: [HNOI2008]遥远的行星( )
  7. 人一生的8种朋友(看看身边的朋友属于哪种)
  8. mybatis查询树形数据的两种方法
  9. Spring Cloud Alibaba Sentinel之持久化篇
  10. 【Hoxton.SR1版本】Spring Cloud Ribbon负载均衡服务调用