题目描述
题意: 已知: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=22/5=00的个数就是2+0=2,再来个例子,20082008/5=401401/5=8080/5=1616/5=30的个数就是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); } else return 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; }
时间: 2024-10-12 20:03:44