逆序对

逆序对

https://ac.nowcoder.com/acm/problem/14731

题意

求所有长度为n的01串中满足如下条件的二元组个数:
设第i位和第j位分别位(i<j),则
答案对1e9+7取模。

分析

我们选取两个位置其中,然后另,这样就构成了一对逆序对,那么剩余个位置有种排列方法,所以就这两个位置对答案产生了个贡献
那么我们选取两个位置有多少种选取方法呢?
用组合数学的知识显然是
所以最后答案就是然后取模
其中

java代码

在java中,提供了BigInteger大整数类和快速幂取模的库函数,所以我们直接调用就可以了

import java.math.BigInteger;
import java.util.Scanner;


public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        BigInteger n=sc.nextBigInteger();
        BigInteger mod=BigInteger.valueOf((long)(1e9+7));
        BigInteger two=BigInteger.valueOf(2);
        BigInteger ans=n.multiply(n.subtract(BigInteger.valueOf(1))).divide(two).multiply(two.modPow(n.subtract(two),mod)).mod(mod);
        System.out.println(ans);
        sc.close();
    }
}

python代码

如果你使用python,那代码会更简短更简单易写,但是并不是所有的赛区都支持python语言

n=int(input())
mod=int(1e9+7)
if n==1:
    print(0)
else:
    ans=n*(n-1)//2*pow(2,(n-2),mod)%mod
    print(ans)
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务