Light oj 1138 - Trailing Zeroes (III) (二分)

题目链接: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。

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int get(int n) {
int cont = ;
while(n / ) {
cont += n / ;
n /= ;
}
return cont;
} int main()
{
int t , n;
scanf("%d" , &t);
for(int ca = ; ca <= t ; ca++) {
scanf("%d" , &n);
int L = , R = ;
while(L < R) {
int mid = (L + R) / ;
if(n <= get(mid))  
R = mid;
else
L = mid + ;
}
printf("Case %d: " , ca);
if(get(L) == n) {
printf("%d\n" , L);
}
else {
printf("impossible\n");
}
}
}
上一篇:vim插件介绍


下一篇:Android DownloadThread.run()学习