分治算法-魔法石的诱惑

**

魔法石的诱惑

**
【题目】:
找到最小的自然数N,使N!在十进制下包含Q个零。
输入格式:
一个数Q(0<=Q<=10^8)
输出格式:
如果无解,输出“No,solution”,否则输出N。
输入样例:
2
输出样例:
10


思路:N!单调递增序列,可以考虑二分,判断 N! 有多少个0,N/5+N/(5^2) + N / (5 ^ 3)+…

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

int solve(int n) 
{
  int ans = 0;
  while (n > 0) 
  {
    ans = ans + n / 5;
    n = n / 5;
  }
  return ans;
}
  
void run() 
{
  //freopen("rob.in","r",stdin);
  //freopen("rob.out","w",stdout);   
  int Q, i;
  scanf("%d", &Q);
  int start = 1;
  int end = 500000000;
  int ans = 500000001;
  int mid;
  int t;
  while (start <= end)//二分查找 
  {
    int mid = (end - start) / 2 + start;
    int t = solve(mid);
    if (t == Q && mid < ans) 
      ans = mid;
    if (t > Q) 
      end = mid - 1;
    else if ( t < Q ) 
      start = mid + 1;
    else 
      end = mid - 1;
  }
  if (ans != 500000001)
    printf("%d\n", ans);
  else
    printf("No solution\n");
}

int main() 
{
  run();
  return 0;
}

发布了430 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zqhf123/article/details/105534284
今日推荐