• LUCAS定理简述


    Lucas定理解决的是n,m比较大而p是小于100000质数


    简而言之就是Lucas(n,m)=C(n%p,m%p)*Lucas(n/p,m/p)%p;

    其中组合数C是用任意一种计算10五次方内取模的组合数计算

    比如可以预处理阶乘fac[i],然后直接C(n,m)=fac[n]*quickpow(fac[n-m]*fac[m],p-2)%p;

    或者O(n)套公式直接算也可以

    要注意n可能小于m,因为是取模后的结果,这个时候返回0【不然会RE】


    下面给的是预处理阶乘的

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define LL long long int
    using namespace std;
    const int maxn=1000005,INF=2000000000;
    
    int P;
    LL fac[2*maxn],N,M;
    
    void cal(){
    	fac[0]=1;
    	for(int i=1;i<=P;i++) fac[i]=fac[i-1]*i%P;
    }
    
    inline LL qpow(LL a,LL b){
    	LL ans=1,base=a%P;
    	while(b){
    		if(b&1) ans=ans*base%P;
    		base=base*base%P;
    		b>>=1;
    	}
    	return ans;
    }
    
    inline LL C(LL n,LL m){
    	if(n<m) return 0;
    	return fac[n]*qpow(fac[n-m]*fac[m]%P,P-2)%P;
    }
    
    LL Lucas(LL n,LL m){
    	if(n<m||!m) return 1;
    	return C(n%P,m%P)*Lucas(n/P,m/P)%P;
    }
    
    int main()
    {
    	int T;
    	cin>>T;
    	while(T--){
    		cin>>N>>M>>P;
    		cal();
    		cout<<Lucas(N+M,M)<<endl;
    	}
    	return 0;
    }
    


  • 相关阅读:
    软件测试作业4
    Android基础知识每日记(持续更新)
    二叉树操作总结
    No.223 Rectangle Area
    No.66 Plus One
    No.80 Remove Duplicates from Sorted Array ||
    No.27 Remove Element
    No.26 Remove Duplicates from Sorted Array
    No.9 Palindrome Number
    No.219 Contains Duplicate ||
  • 原文地址:https://www.cnblogs.com/Mychael/p/8282889.html
Copyright © 2020-2023  润新知