Codeforces Round #678 (Div. 2) C. Binary Search (二分,组合数)
Posted lr599909928
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #678 (Div. 2) C. Binary Search (二分,组合数)相关的知识,希望对你有一定的参考价值。
-
题意:有长度(n)的序列,让你构造序列,使得二分查找能在(pos)位置找到值(x).问最多能构造出多少种排列?
-
题解:题目给出的(pos)是固定的,所以我们可以根据图中所给的代码来进行二分,确定有多少数小于(x)和大于(x),然后根据排列组合即可算出答案.
-
代码:
int n,x,pos; ll fac[N]; ll f[N],invf[N]; ll fpow(ll a,ll k){ ll res=1; while(k){ if(k&1) res=(res*a)%mod; k>>=1; a=a*a%mod; //cout<<1<<endl; } return res; } void init(int n){ f[0]=1; for(int i=1;i<=n;++i){ f[i]=f[i-1]*i%mod; } invf[n]=fpow(f[n],mod-2); for(int i=n-1;i>=0;--i){ invf[i]=invf[i+1]*(i+1)%mod; } } ll C(int n,int k){ if(k<0 || k>n) return 0; return f[n]*invf[k]%mod*invf[n-k]%mod; } int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>n>>x>>pos; init(n); int l=0,r=n; int L=0,R=0; while(l<r){ int mid=(l+r)>>1; if(mid<=pos){ if(mid!=pos) L++; l=mid+1; } else R++,r=mid; } fac[0]=1; for(int i=1;i<=n;++i){ fac[i]=fac[i-1]%mod*i%mod; } cout<<C(x-1,L)%mod*fac[L]%mod*C(n-x,R)%mod*fac[R]%mod*fac[n-L-R-1]%mod<<endl; return 0; }
以上是关于Codeforces Round #678 (Div. 2) C. Binary Search (二分,组合数)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #436 E. Fire(背包dp+输出路径)
[ACM]Codeforces Round #534 (Div. 2)
Codeforces Round #726 (Div. 2) B. Bad Boy(贪心)
Codeforces 678E:Another Sith Tournament 状压DP