hdu 4576

题意:在一个环里从起点随机走c步,一共走m次,问最后站在l~r的概率是多少?

分析:常数优化,想不到就作死。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<vector>
 8 #include<map>
 9 #include<set>
10 #define lson l,m,rt<<1
11 #define rson m+1,r,rt<<1|1
12 #define pbk push_back
13 #define mk make_pair
14 using namespace std;
15 const int N = 10000+10;
16 typedef pair<int,int> pii;
17 typedef long long LL;
18 int n,m,l,r;
19 double dp[2][N];
20 int c[1000000+10],vis[N];
21 const double eps = 1e-10;
22 inline int dcmp(double x){
23     return x < -eps ? -1 : x>eps;
24 }
25 void solve(){
26     memset(dp,0,sizeof(dp));
27     dp[0][1] = 1;
28     int pos = 0;
29     int flag = 0;
30     for (int i = 0; i < m; i++) {
31         for (int j = 1; j <= n; j++) {
32             int v = j + c[i];
33             while (v > n) v -= n;
34             dp[pos^1][j] = dp[pos][v]*0.5;
35             v = j - c[i];
36             while (v <= 0) v += n;
37             dp[pos^1][j] += dp[pos][v]*0.5;
38         }
39         pos ^= 1;
40     }
41     double ret = 0;
42     for (int i = 1; i <= n; i++) {
43         if (i >= l && i <= r)
44         ret += dp[pos][i];
45     }
46     printf("%.4lf\n",ret);
47 }
48 int main(){
49     while (~scanf("%d%d%d%d",&n,&m,&l,&r),n+m+l+r) {
50 
51         for (int i = 0; i < m; i++) {
52             scanf("%d",c+i);
53         }
54         solve();
55     }
56 
57     return 0;
58 }
View Code

相关文章: