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