题意:
解法:
设 f ( x ) 为 从 点 x 到 达 终 点 的 期 望 次 数 , 那 么 : 1. 当 x > = n 时 , f ( x ) = 0. 2. 如 果 x 被 标 记 , 那 么 f ( x ) = f ( 0 ) . 3. 其 他 情 况 f ( x ) = f ( x + 1 ) + f ( x + 2 ) . . . f ( x + m ) m + 1. 因 为 有 f ( 0 ) 存 在 , 那 么 一 定 是 f ( x ) = k f ( 0 ) + b 的 形 式 , 对 于 每 个 位 置 , 维 护 一 下 k 和 b 即 可 . 最 后 f ( 0 ) = k f ( 0 ) + b , 如 果 k = 1 , 那 么 无 解 , 否 则 ( 1 − k ) f ( 0 ) = b , 可 解 得 f ( 0 ) = b 1 − k . 设f(x)为从点x到达终点的期望次数,那么:\\ 1.当x>=n时,f(x)=0.\\ 2.如果x被标记,那么f(x)=f(0).\\ 3.其他情况f(x)=\frac{f(x+1)+f(x+2)...f(x+m)}{m}+1.\\ 因为有f(0)存在,那么一定是f(x)=kf(0)+b的形式,\\ 对于每个位置,维护一下k和b即可.\\ 最后f(0)=kf(0)+b,如果k=1,那么无解,\\ 否则(1-k)f(0)=b,可解得f(0)=\frac{b}{1-k}. 设f(x)为从点x到达终点的期望次数,那么:1.当x>=n时,f(x)=0.2.如果x被标记,那么f(x)=f(0).3.其他情况f(x)=mf(x+1)+f(x+2)...f(x+m)+1.因为有f(0)存在,那么一定是f(x)=kf(0)+b的形式,对于每个位置,维护一下k和b即可.最后f(0)=kf(0)+b,如果k=1,那么无解,否则(1−k)f(0)=b,可解得f(0)=1−kb.
code:
#include <bits/stdc++.h>
using namespace std;
const int maxm=2e6+5;
double sumK[maxm];
double sumB[maxm];
double K[maxm];
double B[maxm];
int mark[maxm];
int n,m,k;
signed main(){
ios::sync_with_stdio(0);
cin>>n>>m>>k;
for(int i=1;i<=k;i++){
int x;cin>>x;
mark[x]=1;
}
K[n]=0,B[n]=0;
for(int i=n-1;i>=0;i--){
int l=i+1,r=i+m;
if(mark[i]){
K[i]=1,B[i]=0;
}else{
K[i]=(sumK[l]-sumK[r+1])/m;
B[i]=(sumB[l]-sumB[r+1])/m+1;
}
sumK[i]=sumK[i+1]+K[i];
sumB[i]=sumB[i+1]+B[i];
}
if(K[0]==1){
cout<<-1<<endl;
return 0;
}
double ans=B[0]/(1-K[0]);
printf("%.10f\n",ans);
return 0;
}