为什么我这题线性求逆元换成快速幂就过了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int p=1e9+7;
const int N=1e5+10;
int fac[N],inv[N];
int ksm(int a,int b){
int c=1;
for(;b;b>>=1){
if(b&1)c=c*a%p;
a=a*a%p;
}
return c;
}
//m个空位 排n个入
int A(int n,int m){
return fac[m]%p*inv[m-n]%p;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,x,pos,cc=0,ccc=0;
cin>>n>>x>>pos;
fac[0]=fac[1]=1;
for(int i=2;i<=N-10;i++){
fac[i]=fac[i-1]*i%p;
}
inv[0]=inv[1]=1;
for(int i=2;i<=N-10;i++){
inv[i]=ksm(fac[i],p-2);//快速幂
// inv[i]=(p-p/i)*inv[p%i]%p; 线性求逆元
}
int l=0,r=n;
while(l<r){
int mid=(l+r)/2;
if(mid<=pos){
l=mid+1;
if(mid<pos)cc++;
}else{
r=mid;
ccc++;
}
}
cout<<A(cc,x-1)%p*A(ccc,n-x)%p*fac[n-cc-ccc-1]%p;
return 0;
}