题目
求所有长度为n的01串中满足如下条件的二元组个数:
设第i位和第j位分别位ai和aj(i
题意理解
我想肯定不能暴力求解,需要来一波推公式。
官方题解
我的理解
代码
n = input()
p = 10 ** 9 + 7
print n * (n - 1) / 2 * pow(2, n - 2, p) % p
注意一下,上面这是python2
public class Main {
static BigInteger pow_mod(BigInteger a, BigInteger n, BigInteger MOD) {
BigInteger ret = BigInteger.ONE;
BigInteger tmp = a.mod(MOD);
while(n.compareTo(BigInteger.ZERO) > 0) {
if(n.mod(BigInteger.valueOf(2)).equals(BigInteger.ONE)) {
ret = ret.multiply(tmp).mod(MOD);
}
tmp = tmp.multiply(tmp).mod(MOD);
n = n.divide(BigInteger.valueOf(2));
}
return ret;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
BigInteger n = scanner.nextBigInteger();
scanner.close();
BigInteger MOD = BigInteger.valueOf(1000000007);
BigInteger t1 = n.multiply(n.subtract(BigInteger.ONE));
BigInteger t2 = pow_mod(BigInteger.valueOf(2), n.subtract(BigInteger.valueOf(3)), MOD);
BigInteger result = t1.multiply(t2).mod(MOD);
System.out.println(result);
}
}
这是Java,用cpp的话好像容易爆精度。
如果不想爆精度,需要把 n∗(n−1)%p 处理一下。如:
long long ans = ((n%P) * (n%P) % P - n % P + P) % P;
ans = ans * pow_mod(2, n-3, P) % P;
其中pow_mod第一个参数是幂底,第二个参数是幂的次数,第三个参数是模的数