传送门

设\(f[i]\)为\(i\)位置向左走一步的期望时间,那么答案就是\(\sum_{i=1}^mf[i]\)

首先\(f[n]=1\),设\(p\)为向左的概率,对于\(i<n\)的位置,有$$f[i]=\sum_{j=1}^{\infty}(j+(j-1)\times f[i+1])(1-p)^{j-1}p$$

就是说枚举一下往右走了几次,左边是走了\(j\)次的步数,右边是走了\(j\)次的概率

根据高中数学知识,这是个等比+等差数列的求和,那么推一下式子可得$$f[i]=\frac{1-p}{p}\times(f[i+1]+1)+1$$

用递推可以做到\(O(n)\)的复杂度,可以有70分

考虑一下,对于一个固定的\(p\),整个数列都是已知的,设\(a=\frac{1-p}{p}\),那么有\(f[n]=1,f[n-1]=2a+1,f[n-2]=2a^2+2a+1,...\),我们只要可以快速求出它的后缀和,然后减一减就可以得到答案了。设\(ans[j]=\sum_{i=n-j+1}^n f[i]\),有\(ans[j]=1+2(n-1)a+2(n-2)a^2+...+2a^{n-1}\),这也是一个等比+等差数列的求和,那么化一下式子可得$$ans[i]=\frac{(2-i)a-i+2a2\frac{1-a{i-1}}{1-a}}{a-1}$$

于是就可以直接求出两个后缀和相减得到答案了

注意特判\(i=0\)和\(i=1\)的情况,一个返回\(0\),一个返回\(1\)

注意特判\(a=1\)的情况,这种情况下\(a-1\)没有逆元不能直接带,打表得此时后缀和为\(ans[i]=i^2\),特判掉就好了

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int P=1e9+7,N=1e6+5;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){
R int res=1;
for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
return res;
}
int n,m,p,q,pi,ppi,res,now,f[N],loli;
int calc(R int n){
if(n==0)return 0;if(n==1)return 1;
if(pi==1)return mul(n,n);
res=mul(dec(2,n),pi),res=dec(res,n);
loli=mul(2,mul(pi,pi)),loli=mul(loli,dec(1,ksm(pi,n-1))),
loli=mul(loli,ksm(dec(1,pi),P-2));
return mul(add(res,loli),ksm(dec(pi,1),P-2));
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d%d%d",&n,&m,&p,&q),pi=mul(p,ksm(q,P-2)),ppi=dec(1,pi);
pi=mul(ppi,ksm(pi,P-2));
printf("%d\n",dec(calc(n),calc(n-m)));
return 0;
}

P5165 xtq的棋盘的更多相关文章

  1. TYVJ1035 棋盘覆盖

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 给出一张n*n(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米诺骨牌进行掩 ...

  2. POJ 1321 棋盘问题(dfs)

    传送门 棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38297   Accepted: 18761 Descri ...

  3. 设计一个自动生成棋盘格子的JS小程序

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. BZOJ1057[ZJOI2007]棋盘制作 [单调栈]

    题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我们的 ...

  5. 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法

    3039: 玉蟾宫 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 753  Solved: 444[Submit][Status][Discuss] D ...

  6. 【ZJOI2007】棋盘制作 BZOJ1057

    Description 国 际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方 阵,对应八八六十四卦,黑白对 ...

  7. Unity手撸2048小游戏——自动生成4*4棋盘

    1.新建文件夹,命prefabs,将刚刚做成的Chessman拖入该文件下,做成预制体 2.删除panel下的Chessman 3.在panel下,新建一个空对象,命名为Chessboard,大小设置 ...

  8. C# 围棋盘的画法

    C#绘图不是那么美,不过对于简单的图形,不注重美感的图质,用C#还是很方便的. 背景颜色.绘制图表线色.纵横列大小可按照个人喜好调节. 不提供AI代码,我自己设计的AI不是很完美,就不拿出来献丑了,算 ...

  9. 炮(棋盘DP)

    一直以为自己写的就是状态压缩,结果写完才知道是个棋盘dp 首先看一下题目 嗯,象棋 ,还是只有炮的象棋 对于方案数有几种,我第一个考虑是dfs,但是超时稳稳的,所以果断放弃 然后记得以前有过和这个题差 ...

随机推荐

  1. HDU 3118 Arbiter 判定奇圈

    题目来源:pid=3118">HDU 3118 Arbiter 题意:翻译过来就是不能有奇圈 每走一步状态会变化 当他回到起点时假设和原来的状态不一样 可能会死 求至少去掉多少条边能够 ...

  2. 为Joomla 2.5的连续插入多幅图像添加便捷方式

    用过Joomla 2.5的朋友应该都知道插入很多图像时是比較麻烦的.点了文章以下的图片button,它会弹出个div,让你选择图片,每选一张.div就关闭. 再选第二张的时候,它又要你又一次选择文件夹 ...

  3. eclipse中progress一直在刷新问题处理

  4. 修改flash builder注释里的@author

    在flash builder里,按Ctrl+Shift+D可以很方便在添加AsDoc注释.可是有些生成的@author是系统的用户名(如:administor),怎么修改这个为自己的名字呢? Step ...

  5. [网页游戏开发]Morn组件赋值

    在讲解List之前,我们先介绍一下Morn组件赋值功能 默认属性赋值 界面逻辑开发过程中,经常会涉及到动态更改UI属性,比如: 界面有一个按钮,一个多选框和一个文本,分别命名为myButton,myC ...

  6. Zip加密解密

    Zip加密解密方法: 1.winzipaes http://blog.csdn.net/zhyh1986/article/details/7724229 2.zip4j http://blog.csd ...

  7. JVM手动分配内存(转载)

    原文内容很详细,不利于快速浏览,所以只保留了重点 原文地址 http://blog.csdn.net/mr__fang/article/details/47723767 内存检测工具jvisualVM ...

  8. 使用双引擎,让kbmmw 的客户端访问更方便(既给浏览器做服务,也给桌面程序做服务)

    前面我们一直都讲了如何使用kbmmw smarthttpservice 给客户端提供REST  服务.主要都是返回给 浏览器访问的,如果我们使用delphi 开发桌面应用,如何使用这些服务呢?其实一切 ...

  9. virtualbox创建centos7虚拟机

    安装Virtualbox 下载安装: 直接到官网上下载,https://www.virtualbox.org/wiki/Downloads 然后一键傻瓜式的安装即可. 设置默认虚拟电脑位置: 管理=& ...

  10. HDU 6108 小C的倍数问题 【数学】 (2017"百度之星"程序设计大赛 - 初赛(A))

    小C的倍数问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...