LightOJ 1138 Trailing Zeroes (III)(二分 + 思维)
http://lightoj.com/volume_showproblem.php?problem=1138
Trailing Zeroes (III)
Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu
Description
You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in decimal notation. As you know N! = 1*2*...*N. For example, 5! = 120, 120 contains one zero on the trail.
Input
Input starts with an integer T (≤ 10000), denoting the number of test cases.
Each case contains an integer Q (1 ≤ Q ≤ 108) in a line.
Output
For each case, print the case number and N. If no solution is found then print 'impossible'.
Sample Input
3
1
2
5
Sample Output
Case 1: 5
Case 2: 10
Case 3: impossible
求最小的N使N!中0的个数等于q
0是有5乘4、2、8等等构成的,N中只要有因子5,那么N!中一定能构成0,所以我们只需要找N中因子5的个数,然后用二分来快速查找N
#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; typedef long long ll; ll solve(ll n) { ll ans = 0; while(n) { ans += n / 5; n /= 5; } return ans; }//求n中因子5的个数 int main() { int t, p = 0; ll q; scanf("%d", &t); while(t--) { p++; scanf("%lld", &q); ll low = 4, high = 500000000; while(low <= high) { ll mid = (low + high) / 2; ll m = solve(mid); if(m < q) low = mid + 1; else high = mid - 1; }//二分 if(solve(low) == q) printf("Case %d: %lld\n", p, low); else printf("Case %d: impossible\n", p); } return 0; }