Codeforces Round #829 (Div. 1) C

C. Wish I Knew How to Sort

我们会发现此题的终点状态只有一个 起点状态也只有一个
所以我们的状态表示可以非常简单
我们可以发现我们为了达到最终的状态 我们用一些1来填补最后几个0的位置才是有效交换
所以dp[i]表示有i个位置的1待补的期望步数
这样我们的状态转移就是:
dp[i]=
1.我们选到了两个位置恰好是有效交换
i/ni/(n-1)然后再全排列2一下
我们把这个概率设为g
dp[i]=gdp[i-1]+(1-g)dp[i]+1 否则就是不是有效交换了
我们把这个dp[i]移到同一边化简就可以得到
dp[i]=1/g+dp[i-1]
这样就做完了
最后记得该%就%

int qmi(int a, int b, int p){
    int res = 1;
    while(b){
        if(b & 1) res = res * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return res;
}
int inv(int x){
    return qmi(x,mod-2,mod);
}
int Mod(int x){return (x%mod+mod)%mod;}
int n;
int dp(int i){
    if(!i)return 0;
    int g=n*(n-1)%mod*inv(2*i*i%mod)%mod;
    return (g+dp(i-1))%mod;
}
void solve(){
    cin>>n;
    vector<int>a(n+10);
    int sum=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    int cnt=0;
    for(int i=n;i>=n-sum+1;i--)if(!a[i])cnt++;
    cout<<Mod(dp(cnt))<<endl;
}
posted @ 2022-11-28 19:25  ycllz  阅读(46)  评论(0)    收藏  举报