题意
求所有长度为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)

京公网安备 11010502036488号