Acwing---887. Find Combination Number III (Java)_Mathematics_Lucas Theorem

Original title link

①. Title

Insert picture description here

②. Thinking

Insert picture description here

Insert picture description hereInsert picture description here

时间复杂度分析

Insert picture description here

③. Learning points

Lucas定理

④. Code implementation

import java.util.Scanner;

public class Main {
    
    
	public static void main(String[] args) {
    
    
		Scanner sc = new Scanner(System.in);
		int n=sc.nextInt();
		long a,b,p;
		while(n-->0) {
    
    
			a=sc.nextLong();
			b=sc.nextLong();
			p=sc.nextLong();
			System.out.println(lucas(a,b,p));
		}
	}
	//快速幂求次方
	static long quickPower(long a,long b,long p) {
    
    
		long res=1;
		while(b>0) {
    
    
			if((b&1)==1) {
    
    
				res=res*a%p;
			}
			a=a*a%p;
			b>>=1;
		}
		return res;
	}
	
	//求组合数 利用函数公式
	static long combination(long a,long b,long p) {
    
    
		long res=1;
		for (long i =1,j=a;i<=b;i++,j--) {
    
    
			res=res*j%p; //a*(a-1)*(a-2)....*(a-b+1)
			res=res*quickPower(i, p-2, p)%p; //快速幂求b的阶乘的逆元
		}
		return res;
	}
	
	static long lucas(long a,long b,long p) {
    
    
		if(a<p&&b<p) {
    
    
			return combination(a, b, p);
		}
		return combination(a%p, b%p, p)*lucas(a/p, b/p, p)%p; //根据lucas公式递归将a b的值缩小
	}

}

Insert picture description here

Guess you like

Origin blog.csdn.net/weixin_45480785/article/details/113896620