LightOj 1138 - Trailing Zeroes (III) 阶乘末尾0的个数 & 二分
Posted 西瓜不懂柠檬的酸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LightOj 1138 - Trailing Zeroes (III) 阶乘末尾0的个数 & 二分相关的知识,希望对你有一定的参考价值。
题目链接:http://lightoj.com/volume_showproblem.php?problem=1138
题意:给你一个数n,然后找个一个最小的数x,使得x!的末尾有n个0;如果没有输出impossible
可以用二分求结果,重点是求一个数的阶乘中末尾含有0的个数,一定和因子5和2的个数有关,因子为2的明显比5多,所以我们只需要求一个数的阶乘的因子中一共有多少个5即可;
LL Find(LL x) { LL ans = 0; while(x) { ans += x/5; x /= 5; } return ans; }
例如125! 125/5 = 25;所以125!中含5的项为25*5+24*5+23*5+...+3*5+2*5+1*5 = 25!*5
所以125!末尾有25+5+1 = 31 个0;
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> typedef long long LL; #define N 1000001 using namespace std; const double eps = 1e-6; LL Find(LL x) { LL ans = 0; while(x) { ans += x/5; x /= 5; } return ans; } int main() { int T, t = 1, n; scanf("%d", &T); while(T --) { scanf("%d", &n); LL ans = 0, L = 2, R = 1000000000; while(L <= R) { LL Mid = (L+R)/2; LL ret = Find(Mid); if(ret == n) ans = Mid; if(ret >= n) R = Mid - 1; else L = Mid + 1; } if(ans == 0) printf("Case %d: impossible\\n", t++); else printf("Case %d: %lld\\n", t++, ans); } return 0; }
以上是关于LightOj 1138 - Trailing Zeroes (III) 阶乘末尾0的个数 & 二分的主要内容,如果未能解决你的问题,请参考以下文章
LightOj 1138 - Trailing Zeroes (III) 阶乘末尾0的个数 & 二分
Trailing Zeroes (I) LightOJ - 1028
LightOJ - 1282 - Leading and Trailing(数学技巧,快速幂取余)
LightOJ - 1282 Leading and Trailing