題意 抄襲自https://www.cnblogs.com/Paul-Guderian/p/7624039.html 多組輸入n,m,l,r。表示在一個環上有n個格子。接下來輸入m個w表示連續的一段命令,每個w表示機器人沿順時針或者逆時針方向前進w格,已知機器人是從1號點出發的,輸出最後機器人停在環 ...
題意
抄襲自https://www.cnblogs.com/Paul-Guderian/p/7624039.html
多組輸入n,m,l,r。表示在一個環上有n個格子。接下來輸入m個w表示連續的一段命令,每個w表示機器人沿順時針或者逆時針方向前進w格,已知機器人是從1號點出發的,輸出最後機器人停在環上[l,r]區間的概率。n(1≤n≤200) ,m(0≤m≤1,000,000)。
Sol
無腦概率dp
$f[i][j]$表示第$i$輪,在$j$位置的概率
轉移的時候枚舉下一輪往哪兒走
最後把$(l, r)$內的加起來即可
#include<cstdio> #include<cstring> using namespace std; const int MAXN = 201; int N, M, l, r; double f[2][MAXN]; int get(int x) { if(x <= 0) x += N; if(x > N) x -= N; return x; } int main() { while(scanf("%d %d %d %d", &N, &M, &l, &r)) { memset(f, 0, sizeof(f)); if(!N && !M && !l && !r) break; int o = 0; f[o][1] = 1; for(int i = 1; i <= M; i++) { o ^= 1; int x; scanf("%d", &x); x %= N; for(int j = 1; j <= N; j++) f[o][j] = (f[o ^ 1][get(j - x)] + f[o ^ 1][get(j + x)]) / 2; } double ans = 0; for(int i = l; i <= r; i++) ans += f[o][i]; printf("%.4lf\n", ans); } return 0; }