求调悬关,组合+费马小定理求乘法逆元,WA on #2
  • 板块P1358 扑克牌
  • 楼主gxcgjy
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/2/23 15:02
  • 上次更新2024/2/23 16:08:35
查看原帖
求调悬关,组合+费马小定理求乘法逆元,WA on #2
685839
gxcgjy楼主2024/2/23 15:02
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1e4 + 200;
ll n,m,A[N],f[N],mod = 10007,ny[N],ans = 1;//乘法逆元 
ll C(ll x,ll y){//求组合数 
	return f[y] % mod * ny[x] % mod * ny[y - x] % mod;
}
ll power(ll a,ll b){
	ll sum = 1;
	while(b > 0){
		if(b & 1){
			sum = sum * a % mod;
			sum %= mod;
		} 
		a = a * a % mod;
		a %= mod;
		b >>= 1;
	}
	return sum % mod;
} 
int main(){
	ll i,j,k,ans = 1;
	cin>>n>>m;
	k = n;
	f[0] = 1;
	for(i = 1;i <= m;i++) cin>>A[i];
	for(i = 1;i <= N;i++){
		f[i] = f[i - 1] * (i % mod);//预处理阶乘
		f[i] = f[i] % mod; 
		ny[i] = power(f[i],mod - 2) % mod;//快速幂求逆元(费马小定理)
//		(a ^ (p - 1)) % p = 1;
//		而 (a * x) % p = 1;
//		得出 (a ^ (p - 2)) 是a模p意义下的乘法逆元 
	} 
//	for(i = 1;i <= 100;i++) cout<<f[i]<<' '<<ny[i]<<endl; 
	for(i = 1;i <= m;i++){
		j = C(A[i],k);
		if(A[i] == k) j = 1;
		//cout<<j<<' ';
		k -= A[i];
		ans = ans * j % mod;
		ans %= mod;
	}	
	cout<<((ans + mod) % mod + mod) % mod;
	return 0;
}
2024/2/23 15:02
加载中...