题目链接:http://lightoj.com/volume_showproblem.php?problem=1138
题目就是给你一个数表示N!结果后面的0的个数,然后让你求出最小的N。
我们可以知道N!里5(包括5的倍数)的个数比2(包括2的倍数)的个数多,所以1对应5!,2对应10!... 而末尾0的个数与N成正比,1e8对应的N最大是400000015。我用二分查询N对应末尾0的个数,要是计算出来末尾0的个数比给你的数还大就L=mid+1,否则就R=mid。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 int get(int n) { 7 int cont = 0; 8 while(n / 5) { 9 cont += n / 5; 10 n /= 5; 11 } 12 return cont; 13 } 14 15 int main() 16 { 17 int t , n; 18 scanf("%d" , &t); 19 for(int ca = 1 ; ca <= t ; ca++) { 20 scanf("%d" , &n); 21 int L = 5 , R = 400000015; 22 while(L < R) { 23 int mid = (L + R) / 2; 24 if(n <= get(mid)) 25 R = mid; 26 else 27 L = mid + 1; 28 } 29 printf("Case %d: " , ca); 30 if(get(L) == n) { 31 printf("%d " , L); 32 } 33 else { 34 printf("impossible "); 35 } 36 } 37 }