#include <bits/stdc++.h>
using namespace std;
int fact[100];
int extgcd(int a, int b,int &x, int &y){//扩展欧几里德求逆元
int d = a;
if(b != 0){
d = extgcd(b, a % b, y, x);
y -= (a / b) * x;
}
else x = 1, y = 0;
return d;
}//d = gcd(a, b);
int mod_inverse(int a,int m){//求modp意义下a的逆元
int x,y;
extgcd(a,m,x,y);
return (m+x%m)%m;
}
int mod_fact(int n,int p,int& e){
e=0;
if(n==0)return 1;
int res=mod_fact(n/p,p,e);
e+=n/p;
if(n/p%2!=0)
return res*(p-fact[n%p])%p;
return res*fact[n%p]%p;
}//第一个不懂的地方就是为什么要乘个RES
int mod_comb(int n,int k,int p){//求CNK模P
if(n<0||k<0||n<k) return 0;
int e1,e2,e3;
int a1=mod_fact(n,p,e1);//得到a1与e1
int a2=mod_fact(k,p,e2);//得到a2与e2
int a3=mod_fact(n-k,p,e3);//得到a2与e2
if(e1>e2+e3) return 0;//如果e1>e2+e3就表明除完之后还
排列组合CNK模P
最新推荐文章于 2023-03-10 11:15:52 发布
本文深入探讨了在模P意义下计算排列组合CNK的方法,涉及数论与组合数学的交叉应用,揭示了数学内在的周期性和美妙规律。通过实例解析,帮助读者理解这一理论在密码学、编码理论等领域的重要应用。
摘要由CSDN通过智能技术生成