题目描述
题意: 已知:N!=N*(N-1)*...*2*1 找到最小自然数 N, 使N!末尾有连续 M个零. 例如, 5! 的结尾包含1个零.
输入
第一行输入一个整数T,表示有T组测试数据。 对于每组测试数据,输入一个整数M,表示包含M个零。(0<=M<=10^8)
输出
每组数据,输出一行满足条件的最小自然数N。 如果无解,输出“No solution”。(不含引号)
--
正文
对于n!,可以算出他末尾的0
10!
零的个数可以由这样算出
10/5=2
2/5=0
0的个数就是2+0=2,再来个例子,2008
2008/5=401
401/5=80
80/5=16
16/5=3
0的个数就是401+80+16+3=500个零
在一个肯定ok的范围内二分找就好
#include <cstdio> #include <iostream> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std;typedef long long LL; #define MAXN 500000000 LL f(LL n){LL res = 0;while (n >= 5) {n /= 5;res += n;}return res; }LL findm(LL left,LL right,LL m){ // printf("%lld %lld\n",left,right);if (left == right){if (f(left) != m)return 0;else return left;}if (left == right - 1){if (f(left) != m){if (f(right) != m){return 0;}else return right;}else return left;}LL mid = (left+right)/2;LL fmid = f(mid);if ( m > fmid ){return findm(mid,right,m);} elsereturn findm(left,mid,m); }int main(){int time,T;scanf("%d",&T);for (time=1;time<=T;time++){LL m;scanf("%lld",&m);LL res = findm(1,MAXN,m);if (res == 0){printf("No solution\n");}else printf("%lld\n",res);}return 0; }