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;
}
标签:return,int,res,sum,Codeforces,829,Div,dp,mod
From: https://www.cnblogs.com/ycllz/p/16933377.html