zoukankan      html  css  js  c++  java
  • 【HDOJ6595】Everything Is Generated In Equal Probability(期望DP)

    题意:给定一个N,随机从[1,N]里产生一个n,

    然后随机产生一个n个数的全排列,求出n的逆序数对的数量并累加ans,

    然后随机地取出这个全排列中的一个子序列,重复这个过程,直到为空,求ans在模998244353下的期望

    思路:期望仅与长度有关,随手推一下式子

    听说有通项公式

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 typedef unsigned int uint;
     5 typedef unsigned long long ull;
     6 typedef pair<int,int> PII;
     7 typedef pair<ll,ll> Pll;
     8 typedef vector<int> VI;
     9 #define N  110000
    10 #define M  1100000
    11 #define fi first
    12 #define se second
    13 #define MP make_pair
    14 #define pi acos(-1)
    15 #define mem(a,b) memset(a,b,sizeof(a))
    16 #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
    17 #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
    18 #define lowbit(x) x&(-x)
    19 #define Rand (rand()*(1<<16)+rand())
    20 #define id(x) ((x)<=B?(x):m-n/(x)+1)
    21 #define ls p<<1
    22 #define rs p<<1|1
    23 
    24 const ll MOD=998244353,inv2=(MOD+1)/2;
    25       double eps=1e-6;
    26       ll INF=1e14;
    27 
    28 ll fac[N],inv[N],dp[N],mi[N];
    29 
    30 ll pw(ll x,ll y)
    31 {
    32     ll t=1;
    33     while(y)
    34     {
    35         if(y&1) t=t*x%MOD;
    36         x=x*x%MOD;
    37         y>>=1;
    38     }
    39     return t;
    40 }
    41 
    42 int read()
    43 {
    44    int v=0,f=1;
    45    char c=getchar();
    46    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
    47    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
    48    return v*f;
    49 }
    50 
    51 ll calc(ll n)
    52 {
    53     ll t=n*(n-1)/2;
    54     return t*inv2%MOD;
    55 }
    56 
    57 ll c(ll n,ll m)
    58 {
    59     if(n<m||m<0) return 0;
    60     ll t=fac[n]*inv[m]%MOD*inv[n-m]%MOD;
    61     return t;
    62 }
    63 
    64 int main()
    65 {
    66     //freopen("1.in","r",stdin);
    67     //freopen("1.out","w",stdout);
    68     int n;
    69     fac[0]=1;
    70     rep(i,1,3000) fac[i]=fac[i-1]*i%MOD;
    71     inv[0]=inv[1]=1;
    72     rep(i,2,3000) inv[i]=inv[MOD%i]*(MOD-MOD/i)%MOD;
    73     rep(i,1,3000) inv[i]=inv[i-1]*inv[i]%MOD;
    74     mi[0]=1;
    75     rep(i,1,3000) mi[i]=mi[i-1]*inv2%MOD;
    76     rep(i,1,3000)
    77     {
    78         ll t=0;
    79         rep(j,1,i-1) t=(t+dp[j]*c(i,j)%MOD*mi[i]%MOD)%MOD;
    80         dp[i]=(calc(i)+t)%MOD*pw(1ll-mi[i]+MOD,MOD-2)%MOD;
    81     }
    82     rep(i,1,3000) dp[i]=(dp[i]+dp[i-1])%MOD;
    83     inv[0]=inv[1]=1;
    84     rep(i,2,3000) inv[i]=inv[MOD%i]*(MOD-MOD/i)%MOD;
    85     while(scanf("%d",&n)!=EOF)
    86     {
    87         printf("%I64d
    ",dp[n]*inv[n]%MOD);
    88     }
    89     return 0;
    90 }
  • 相关阅读:
    Python3安装
    HTML基础
    Python Socket
    python常用模块
    JSON.stringify的三个参数
    判断数组中存在重复元素
    vant-ui表单验证
    如何计算出浏览器的帧数?requestAnimationFrame
    js判断两个区间是否存在交集
    怎么在组件内部判断出是否插入了slot
  • 原文地址:https://www.cnblogs.com/myx12345/p/11584100.html
Copyright © 2011-2022 走看看