Kejin Player 期望DP 

题意:

初始等级为1,每一级有四个参数 r , s , x , a 。 

每一级有一个概率p=r/s花费a的代价升级到下一级,失败可能会倒退到x级

 

设从 l 到 r 的期望为 g(l, r), 这种期望满足减法 g(l, r) = g(1, r) − g(1, l).

因为升级只能一级一 级升, 所以要从 1 升级到 r, 必然要经过 l.

求一个前缀和

sum[i+1]=sum[i]+ai * si / ri + (sum[i]-sum[x])*(si-ri)/ri;

ai * si / ri + (sum[i]-sum[x])*(si-ri)/ri  这个类似于二项分布

一个是升到下一级的花费,一个是失败后回到 i 这一级的花费

 1 #include <set>
 2 #include <map>
 3 #include <stack>
 4 #include <queue>
 5 #include <cmath>
 6 #include <cstdio>
 7 #include <string>
 8 #include <vector>
 9 #include <time.h>
10 #include <cstring>
11 #include <iostream>
12 #include <algorithm>
13 #include <unordered_map>
14 
15 
16 #define  pi acos(-1.0)
17 #define  eps 1e-9
18 #define  fi first
19 #define  se second
20 #define  rtl   rt<<1
21 #define  rtr   rt<<1|1
22 #define  bug               printf("******\n")
23 #define  mem(a, b)         memset(a,b,sizeof(a))
24 #define  name2str(x)       #x
25 #define  fuck(x)           cout<<#x" = "<<x<<endl
26 #define  sf(n)             scanf("%d", &n)
27 #define  sff(a, b)         scanf("%d %d", &a, &b)
28 #define  sfff(a, b, c)     scanf("%d %d %d", &a, &b, &c)
29 #define  sffff(a, b, c, d) scanf("%d %d %d %d", &a, &b, &c, &d)
30 #define  pf                printf
31 #define  FIN               freopen("../date.txt","r",stdin)
32 #define  gcd(a, b)         __gcd(a,b)
33 #define  lowbit(x)         x&-x
34 #define  IO                iOS::sync_with_stdio(false)
35 
36 
37 using namespace std;
38 typedef long long LL;
39 typedef unsigned long long ULL;
40 const int maxn = 1e6 + 7;
41 const int maxm = 8e6 + 10;
42 const int INF = 0x3f3f3f3f;
43 const int mod = 1e9 + 7;
44 
45 LL expmod(LL a, LL b) {
46     LL res = 1;
47     while (b) {
48         if (b & 1) res = res * a % mod;
49         a = a * a % mod;
50         b = b >> 1;
51     }
52     return res;
53 }
54 
55 
56 int t, n, q;
57 struct node {
58     LL r, s, x, a;
59 } qu[maxn];
60 LL sum[maxn];
61 
62 int main() {
63     //FIN;
64     sf(t);
65     while (t--) {
66         sff(n, q);
67         for (int i = 1; i <= n; i++) scanf("%lld%lld%lld%lld", &qu[i].r, &qu[i].s, &qu[i].x, &qu[i].a);
68         sum[1] = 0;
69         for (int i = 1; i <= n; i++) {
70             sum[i + 1] = sum[i] + qu[i].s * expmod(qu[i].r, mod - 2) % mod * qu[i].a % mod +
71                          (qu[i].s - qu[i].r + mod) % mod * expmod(qu[i].r, mod - 2) % mod *
72                          (sum[i] - sum[qu[i].x] + mod) % mod;
73            // printf("sum[%d] = %d\n", i + 1, sum[i + 1]);
74             sum[i+1]%=mod;
75         }
76         while (q--) {
77             int L, R;
78             sff(L, R);
79             printf("%lld\n", (sum[R] - sum[L]+mod)%mod);
80         }
81     }
82     return 0;
83 }
View Code

相关文章:

  • 2022-03-06
  • 2021-08-19
  • 2021-07-10
  • 2021-11-10
  • 2021-05-18
  • 2021-08-21
  • 2021-08-01
猜你喜欢
  • 2021-11-18
  • 2021-08-04
  • 2021-12-09
  • 2021-09-26
相关资源
相似解决方案