• 1009E Intercity Travelling 【数学期望】


    题目:戳这里

    题意:从0走到n,难度分别为a1~an,可以在任何地方休息,每次休息难度将重置为a1开始。求总难度的数学期望。

    解题思路:

    这题很像,利用期望的可加性,我们分析每个位置的状态,不管怎么休息位置1的难度永远是a1,因此其期望为a1*2^(n-1),其他点出现a1的话,说明上一个点绝对休息过,剩下的都与其无关,也就是2^(n-2),所有的统计起来,则a1的出现次数为2^(n-1)+(n-1)*2^(n-2)。同理求a2,a2绝对不会出现在位置1,而出现在位置2时,只会影响位置1,出现在其他点,会影响其前两个点,则a2的出现次数为2^(n-2)+(n-2)*2^(n-3),再推推a3,a4,基本可以推出这个公式E[i]=(2^(n-i)+(n-i)*2^(n-i-1))*a[i]。

    注意这题卡时间,不要用快速幂。

    附本人代码:

     1 #include <bits/stdc++.h>
     2 typedef long long ll;
     3 const int maxn = 1e6+10;
     4 const ll inf = 1e18;
     5 const ll mod = 998244353;
     6 using namespace std;
     7 ll qmul(ll a, ll b) {
     8     ll res = 0;
     9     while(b) {
    10         if(b&1) res = (res + a) % mod;
    11         b>>=1;
    12         a = (a + a) % mod;
    13     }
    14     return res;
    15 }
    16 ll qmod(ll a, ll b) {
    17     ll res = 1;
    18     while(b) {
    19         if(b&1) res = qmul(res, a) % mod;
    20         b>>=1;
    21         a = qmul(a,a)%mod;
    22     }
    23     return res;
    24 }
    25 ll rec[maxn];
    26 ll nu[maxn];
    27 int main(){
    28     ll n, m;
    29     scanf("%lld", &n);
    30     rec[0]=1ll;
    31     for(ll i = 1; i <= n; ++i) {
    32         rec[i] = qmul(2ll, rec[i-1]);
    33     }
    34     for(ll i = 1; i <= n; ++i) {
    35         scanf("%lld", nu+i);
    36     }
    37     ll ans = 0;
    38     for(ll i = 1; i <= n; ++i) {
    39         ans = (ans + qmul(nu[i], rec[n-i] + qmul(n-i, rec[n-i-1ll]))) %mod;
    40     }
    41     printf("%lld
    ", ans);
    42     return 0;
    43 }
    View Code
  • 相关阅读:
    POJ 1987 Distance Statistics(树的点分治)
    rabbitmq-c初探
    [置顶] Android开发实战记录(三)---HelloWorld
    debug连线指令
    Qt之信号连接,你Out了吗?
    hdu-4607-Park Visit
    MySQL 分区表 partition线上修改分区字段,后续进一步学习partition (1)
    如何用正则将多个空格看成一个空格结合spllit()方法将文本数据入库
    hdu 1711 Number Sequence(KMP模板题)
    [leetcode]Unique Paths
  • 原文地址:https://www.cnblogs.com/zmin/p/9985599.html
Copyright © 2020-2023  润新知