Wannafly挑战赛6 C.逆序对(组合数学)

题意:

在这里插入图片描述
在这里插入图片描述

解法:

显 然 n = 1 时 答 案 为 0 , 下 面 考 虑 n > = 2 的 情 况 : 考 虑 第 i 位 为 0 时 , 所 有 长 度 为 n 的 串 中 一 共 有 多 少 个 1 在 [ 1 , i − 1 ] 位 . 因 为 每 一 位 只 有 0 和 1 两 种 情 况 , 因 此 最 终 0 和 1 的 数 量 是 相 同 的 , 所 以 [ 1 , i − 1 ] 位 1 的 个 数 为 ( i − 1 ) ∗ 2 i − 1 / 2 , 即 ( i − 1 ) ∗ 2 i − 2 , 满 足 第 i 位 为 0 的 串 共 有 2 n − i 个 ( 就 是 后 面 n − i 位 任 意 取 的 方 案 数 ) , 因 此 第 i 位 为 0 对 答 案 的 贡 献 为 ( i − 1 ) ∗ 2 i − 2 ∗ 2 n − i = ( i − 1 ) ∗ 2 n − 2 . a n s = ∑ i = 2 n ( i − 1 ) ∗ 2 n − 2 = 2 n − 2 ∑ i = 2 n ( i − 1 ) = [ ( n − 1 ) ∗ n / 2 ] ∗ 2 n − 2 . 显然n=1时答案为0,下面考虑n>=2的情况:\\考虑第i位为0时,所有长度为n的串中一共有多少个1在[1,i-1]位.\\ 因为每一位只有0和1两种情况,因此最终0和1的数量是相同的,\\ 所以[1,i-1]位1的个数为(i-1)*2^{i-1}/2,即(i-1)*2^{i-2},\\ 满足第i位为0的串共有2^{n-i}个(就是后面n-i位任意取的方案数),\\ 因此第i位为0对答案的贡献为(i-1)*2^{i-2}*2^{n-i}=(i-1)*2^{n-2}.\\ ans=\sum_{i=2}^n(i-1)*2^{n-2}=2^{n-2}\sum_{i=2}^n(i-1)\\=[(n-1)*n/2]*2^{n-2}.\\ n=10,n>=2:i0,n1[1,i1].01,01,[1,i1]1(i1)2i1/2(i1)2i2,i02ni(ni),i0(i1)2i22ni=(i1)2n2.ans=i=2n(i1)2n2=2n2i=2n(i1)=[(n1)n/2]2n2.

code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int ppow(int a,int b,int mod){
    int ans=1%mod;a%=mod;
    while(b){
        if(b&1)ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
signed main(){
    int n;cin>>n;
    if(n==1){
        cout<<0<<endl;
    }else{
        int ans=(n%mod)*(n%mod-1+mod)%mod*ppow(2,mod-2,mod)%mod;
        ans=ans*ppow(2,n-2,mod)%mod;
        cout<<ans<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值