zoukankan      html  css  js  c++  java
  • 排列最小值 [期望]

    排列最小值


    color{red}{正解部分}

    首先排列中第 ii 个元素作为前 ii 个元素的最小值的概率为 1ifrac{1}{i},

    f[i]f[i] 表示排列第 ii 个元素是否为前 ii 个元素的最小值, 值为 0/10/1,
    根据题目要求, 期望为 ans=(i=1nf[i])2=i=1nj=1nf[i]f[j]ans = left( sumlimits_{i=1}^n f[i] ight)^2 = sumlimits_{i=1}^n sumlimits_{j=1}^n f[i]f[j],

    i=ji = j 时, f[i]f[j]=1f[i]f[j] = 1 的概率为 1ifrac{1}{i}, 在上式对期望的贡献为 i=1n1isumlimits_{i=1}^n frac{1}{i} .
    i !=ji != j 时, f[i]f[j]=1f[i]f[j] = 1 的概率为 1i×1jfrac{1}{i} imes frac{1}{j},
    在上式对期望的贡献为 i=1n1i((j=1n1j)1i)=(i=1n1i)2i=1n1i2sumlimits_{i=1}^n frac{1}{i}left( (sumlimits_{j=1}^n frac{1}{j}) - frac{1}{i} ight) = left(sumlimits_{i=1}^nfrac{1}{i} ight)^2 - sumlimits_{i=1}^n frac{1}{i^2} .

    所以 ansans 的期望为 i=1n1i+(i=1n1i)2i=1n1i2sumlimits_{i=1}^n frac{1}{i}+left(sumlimits_{i=1}^nfrac{1}{i} ight)^2 - sumlimits_{i=1}^n frac{1}{i^2},

    然后使用 ansans 乘上 n!n! 即为题目中的答案 .


    color{red}{实现部分}

    #include<bits/stdc++.h>
    #define reg register
    
    int read(){
            char c;
            int s = 0, flag = 1;
            while((c=getchar()) && !isdigit(c))
                    if(c == '-'){ flag = -1, c = getchar(); break ; }
            while(isdigit(c)) s = s*10 + c-'0', c = getchar();
            return s * flag;
    }
    
    const int maxn = 1e5 + 10;
    const int mod = 998244353;
    
    int N;
    int Q_;
    int inv[maxn];
    int fac[maxn];
    int sum_1[maxn];
    int sum_2[maxn];
    
    void Work(){
            N = read();
            int Ans = (sum_1[N] - sum_2[N] + mod) % mod;
            Ans = (1ll*Ans + (1ll*sum_1[N]*sum_1[N]%mod)) % mod;
            Ans = 1ll*Ans*fac[N] % mod;
            printf("%d
    ", Ans);
    }
    
    int main(){
            Q_ = read();
            fac[0] = 1; for(reg int i = 1; i < maxn; i ++) fac[i] = 1ll*fac[i-1]*i % mod;
            inv[1] = 1; for(reg int i = 2; i < maxn; i ++) inv[i] = ((-1ll*mod/i*inv[mod%i])%mod + mod) % mod;
            for(reg int i = 1; i < maxn; i ++){
                    sum_1[i] = (sum_1[i-1] + inv[i]) % mod;
                    sum_2[i] = (sum_2[i-1] + (1ll*inv[i]*inv[i]%mod)) % mod;
            }
            while(Q_ --) Work();
            return 0;
    }
    
  • 相关阅读:
    Java面试题2(转)
    Java面试题1(转)
    RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总
    Java List与数组之间的转换
    JAVA面试题(3)
    JAVA面试题(2)
    JAVA面试题(1)
    SpringMVC 后台怎么获取前台jsp页面中file中的文件
    QMessageBox中按钮的汉化
    关于字符串的一些重要方法
  • 原文地址:https://www.cnblogs.com/zbr162/p/11822456.html
Copyright © 2011-2022 走看看