LeetCode第155场周赛:51978 -丑数 III(二分答案+容斥原理)

LeetCode第155场周赛:51978 -丑数 III(二分答案+容斥原理)_第1张图片

思路:因为数很大,我们不可能一一枚举,这类题有个固定的套路就是二分答案,想到这里这道题你已经完成了一半了,剩下的就是思考如何更快的判断当前答案是否合法,我们要想那些数是可以被a或者b或者c除尽的呢?没错,不就是他们的倍数吗哈哈哈,但是我们无脑加倍数肯定会算重复呀,因此容斥原理搞一搞啦。不会容斥的还是别搞acm了(话说狠了,小可爱们可以去百度一下的哈)。。。。

class Solution {
    public int nthUglyNumber(int n, int a, int b, int c) {
        long l=1,r=Math.min((long)n*a, Math.min((long)n*b, (long)n*c));
        long ans=r;
        while(l<=r)
        {
        	long mid=(l+r)/2;
        	if(check(mid,a,b,c)>=n)
        	{
        		ans=mid;
        		r=mid-1;
        	}
        	else
        		l=mid+1;
        }
        return (int)ans;
    }
    private long check(long x,int a,int b,int c)
    {
    	long tt1=gcd((long)a,(long)b);
    	long tt2=gcd((long)b,(long)c);
    	long tt3=gcd((long)a,(long)c);
    	long t1=(long)a*b/tt1;
    	long t2=(long)a*c/tt3;
    	long t3=(long)b*c/tt2;
    	long t4=(long)t1*c/gcd(t1,(long)c);
    	
    	long sum=0;
    	sum+=x/a+x/b+x/c;
    	sum-=x/t1+x/t2+x/t3;
    	sum+=x/t4;
    	return sum;
    }
    	
    private long gcd(long a,long b)
    {
    	if(b==0)
    		return a;
    	return gcd(b,a%b);
    }
}

 

你可能感兴趣的:(LeetCode第155场周赛:51978 -丑数 III(二分答案+容斥原理))