【Tai_mount】算法学习 - 数论 - 组合数中模大质数相关问题(费马小定理,逆元,快速幂,线性递推)
菜鸡今天算是第一次尝试ACM相关的比赛(xjtu那边的训练赛),然后签到题被这个算组合数难住了。训练赛的话,我报以学习的目的(反正也做不了两个题的……)就边做边学了orz当然正式比赛不阔能这样的。
题目就是,一个宿舍n个人,问可以建立几个人数大于k的群。(经典女生宿舍笑话)
百度到一篇文章:
https://blog.csdn.net/qq_42403429/article/details/103311855
以下是自己的精简笔记:
概念:
费马小定理:p为质数,a%p!=0 => a^(p-1)≡1(mod p)
逆元:ax≡1(mod p)(a,p互质),则x为a关于p的逆元
有如下性质:t/a≡tb(mod p)
思路:
组合数需要模大质数,需要用到除法,只有+-*满足先取余再相+-*的要求,遇到除法就通过逆元来变成乘法,求逆元需要用到费马小定理,费马小定理里求幂需要快速幂或者线性递推。
费马小定理求逆元
a^(p-1)≡1(mod p) => a^(p-2)a≡1 (mod p) 所以a^(p-2)是a的逆元
快速幂
ab,把b拆成1,2,4,8……(写成二进制),然后我们只要算a1,a2,a4,a^8……就好。
原来学过不过忘了这会儿,贴一个刚找到的过来:
https://zhuanlan.zhihu.com/p/95902286
int qpow(int a,int n){
	int ans=1;
	while(n){
		if(n&1){
			ans*=a;
		}
		a*=a;
		n>>=1;
	}
	return ans;
}
相信我看到这里肯定就理解了就不解释了
线性递推
学完再补
                    
                
                
            
        
浙公网安备 33010602011771号