题目:https://codeforces.com/contest/1436/problem/C
ac代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long int LL ;
const LL mod = 1e9 + 7;
LL kuai(LL A , LL B , LL C)
{
LL res = 1 % C;
for( ; B ; B >>= 1)
{
if(B&1)res = res * A % C;
A = A* A % C;
}
return res;
}
const int N = 1e3 + 10;
LL f[N][N];
void init()
{
for(int i = 0; i <= 1000 ; i ++)
for(int j = 0; j <= i ; j ++)
{
if(!j)f[i][j] = 1;
else
{
f[i][j] = (f[i-1][j] + f[i-1][j-1])%mod;
}
}
}
vector <int> v;;
void find()
{
v.push_back(2);
v.push_back(3);
v.push_back(1);
v.push_back(4);
v.push_back(0);
int l = 0 , r = 4;
while(l < r)
{
cout << l <<' '<< r <<endl;
int mid = l + r >> 1;
cout <<"ÖмäÖµ"<< mid <<' '<< v[mid]<< endl;
if(v[mid] <= 1)l = mid + 1;
else r = mid ;
}
cout << l <<' '<<r <<endl;
cout << v[l-1] <<endl;
if(l > 0 && v[l-1] == 1)cout <<"ALSJDL"<<endl;
}
LL n ,x , pos;
void ooo()
{
int l = 0 ,r = n ;
int xiao = 0 ;
int da = 0 ;
while(l < r)
{
int mid = l + r >> 1;
if(mid >= pos)
{
r = mid ;
if(pos != mid)da ++ ;
}
else
{
l = mid + 1;
xiao ++ ;
}
}
cout <<da<<' '<< xiao << endl;
}
int main()
{
init();
cin >> n >> x >> pos;
int l = 0 ,r = n;
int xiao ;
int da;
xiao = da = 0 ;
while(l < r)
{
int mid = l + r >> 1;
// if(mid >= pos)
// {
// if(mid != pos)da ++ ;
// r = mid ;
// }
// else
// {
// l = mid + 1;
// xiao ++ ;
// }
if(mid <= pos)
{
l = mid + 1;
if(mid != pos)xiao ++ ;
}
else
{
r = mid;
da ++;
}
}
// cout << xiao <<' '<<da<<endl;
// cout << xiao <<' '<< da <<endl;
LL ans , ans2;
ans = 1 ;
int fenxiao = x - 1;
int fenda = n - x;
if(xiao)ans = ans * f[fenxiao][xiao] % mod;
if(da)ans = ans * f[fenda][da] % mod;
for(int i = 1; i <= xiao ; i ++)
{
ans = ans * i % mod;
}
for(int i = 1; i <= da ; i ++)
{
ans = ans * i % mod;
}
// cout << ans <<endl;
ans2 = 1;
int k = n - xiao - da - 1;
for(int i = 1; i <= k ; i ++)
{
ans = ans * i % mod;
}
cout << ans <<endl;
return 0;
}