一个问题
  • 板块题目总版
  • 楼主mxjz666
  • 当前回复5
  • 已保存回复5
  • 发布时间2025/7/31 09:43
  • 上次更新2025/7/31 15:00:21
查看原帖
一个问题
833682
mxjz666楼主2025/7/31 09:43

为什么我这题线性求逆元换成快速幂就过了。

代码:

#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;
}

2025/7/31 09:43
加载中...