【二分】阶乘0的数量

一发过!

题目-阶乘0的数量 V2 (51nod.com)

题意:

【二分】阶乘0的数量_第1张图片

思路:

首先是个常识:一个数结尾0的个数取决于(2,5)这一对的个数,即5这个因子的个数

然后注意特殊性,1e9个0,说明不能算出来

然后n越大,阶乘里的0的个数就越多,所以满足二段性,所以可以二分

统计阶乘中因子p的个数可以这样算:n/p的个数,n/(p*p)的个数....这样加起来就好了

Code:

#include 

#define int long long

using namespace std;

using i64 = long long;

const int mxn=1e7+10;
const int mxe=1e7+10;
const int Inf=1e9;

int k,ans;

bool check(int x){
	int res=0;
	while(x){
		res+=x/5;
		x/=5;
	}
	return res>=k;
}
void solve(){
	cin>>k;
	int l=1,r=1e18;
	while(l<=r){
		int mid=l+r>>1;
		if(check(mid)){
			ans=mid;
			r=mid-1;
		}else l=mid+1;
	}
	cout<>__;
	while(__--)solve();return 0;
}

 

你可能感兴趣的:(数学,数据结构)