XidianOJ 1019 自然数的秘密
生活随笔
收集整理的這篇文章主要介紹了
XidianOJ 1019 自然数的秘密
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
題意: 已知: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; }?
轉載于:https://www.cnblogs.com/ToTOrz/p/6106471.html
總結
以上是生活随笔為你收集整理的XidianOJ 1019 自然数的秘密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大型网站系统架构实践(四)http层负载
- 下一篇: 组态软件mcgs入库mysql_昆仑通态