codeforces 1426C.二进制搜索

题目
题意:给出三个数:数组的长度: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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值