题目
题意:给出三个数:数组的长度:n、要查找的数:x、要查找数的下标:p
自己模拟题目给出的二分,找到给出的数,求出可以得到该数的所有序列的数量
思路:本题的思路主要在模拟二分上,首先将给出的n个数分为大于要查找的数的个数n-x个和小于要查找数x-1个,接着开始模拟二分,对于每一个mid,如果大于p需要填上一个大于x的数,这又(x-1)种情况(每次都要对小于的减一),反之则反之,
而剩下的(n+m)个数就是没用的数,直接全排列即可
AC代码:
import java.util.*;
import java.math.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int x=sc.nextInt();
int p=sc.nextInt();
int l=0,r=n;
n-=x;//比要找数大的数的数量
x--;//比要找数小的数的数量
long mod=1000000007,f=1;
for(int m=(l+r)/2; l<r; m=(l+r)/2) {//找到p的位置
if(m>p){//大于要找的位置,该处需要放一个大于该数的值,n个数里面的一个
r=m;
f=f*n%mod;
n--;
}else{//反之则放小于该数的值,m个数里面的一个
l=m+1;
if(m<p) {
f=f*x%mod;
x--;
}
}
}
System.out.println(n+x);
for(int i=1;i<=n+x;i++) {//对剩下没用的数进行全排列
f=f*i%mod;
}
System.out.println(f);
}
}