求助今晚CF-C
  • 板块学术版
  • 楼主haooo
  • 当前回复6
  • 已保存回复6
  • 发布时间2020/10/25 00:26
  • 上次更新2023/11/5 09:57:05
查看原帖
求助今晚CF-C
67618
haooo楼主2020/10/25 00:26

可能是思路错了,思路是标记受限制的数(比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;
}

2020/10/25 00:26
加载中...