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 }