嗯...
题目链接:https://vjudge.net/contest/318956#problem/E
这道题是二分答案+数论,但首先是数论,否则你不知如何二分...
首先关于一个阶乘的结果最后会出现0(即10),肯定是由2 * 5所造成的,而对于正整数 N,在[0, N]范围内,质因子中含有 2 的总是会比质因子含有 5 的要多。所以,只要需要知道质因数含有 5 的数字有多少个,即可知道末尾连续出现 0 的个数有多少...
然后我们进行二分答案,从1~5e8 + 5(一定要足够大!)进行二分,如果当前答案处理出来的5的个数正好等于a,那么它可能是答案,因为可能我们把较小的遗漏了,所以我们要继续二分,如果有比它小的,继续更新...
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 4 using namespace std; 5 6 inline int check(int x){ 7 int ans = 0; 8 while(x){ 9 ans += x / 5; 10 x /= 5; 11 } 12 return ans; 13 }//处理5的个数,即末尾0的个数 14 15 int main(){ 16 int t, m = 0; 17 scanf("%d", &t); 18 while(t--){ 19 int ans = 0, a; 20 m++; 21 scanf("%d", &a); 22 int l = 1, r = 5e8 + 5; 23 while(l <= r){ 24 int mid = (l + r) >> 1; 25 int _mid = check(mid); 26 if(_mid > a) r = mid - 1; 27 else if(_mid < a) l = mid + 1; 28 else if(_mid == a) {ans = mid; r = mid - 1;}//可能有答案遗漏 29 } 30 if(ans) printf("Case %d: %d\n", m, ans); 31 else printf("Case %d: impossible\n", m); 32 } 33 return 0; 34 }