可能是思路错了,思路是标记受限制的数(比x大 比x小),然后排列组合 代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=1005;
const ll mod=1e9+7;
int vis[MAXN];
ll n,pos,x;
inline ll A(ll a,ll b){
ll ans=1;
for(ll i=0;i<b;i++) ans=ans*(a-i)%mod;
return ans;
}
inline ll C(ll a,ll b){return (A(a,b)/A(b,b))%mod;}
int main(){
scanf("%lld%lld%lld",&n,&x,&pos);
ll l=0,r=n;
while(l<r){
ll mid=(l+r)>>1;
if(mid<=pos){
vis[mid]=-1;
l=mid+1;
}
else{
r=mid;
vis[mid]=1;
}
}
vis[pos]=2;
ll num1=0,num2=0,num3=0;
//num1为无限制的数的个数
//num2为需要小于x的数的个数
//num3为需要大于x的数的个数
for(int i=0;i<n;i++){
if(vis[i]==-1) num2++;
else if(vis[i]==1) num3++;
else if(vis[i]==0) num1++;
}
if(n-x<num3||x-1<num2){
cout<<0;
return 0;
}
ll ans=(C(x-1,num2)*C(n-x,num3))%mod*A(num1,num1)%mod;
printf("%lld",ans);
return 0;
}