码迷,mamicode.com
首页 > 其他好文 > 详细

SGU - 154 Factorial(阶乘素因子次数的逆问题)

时间:2016-08-18 23:29:28      阅读:359      评论:0      收藏:0      [点我收藏+]

标签:

题目:

You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in decimal notation. As you know N! = 1*2*...*N. For example, 5! = 120, 120 contains one zero on the trail.

Input
One number Q written in the input (0<=Q<=10^8).

Output
Write "No solution", if there is no such number N, and N otherwise.

Sample test(s)

Input

2
Output

10

这个题目还是要用下面这个函数

long long degree_in_fact(long long m, int p)
{
	if (m)return degree_in_fact(m / p, p) + m / p;
	return 0;
}

不知道原理的可以点击打开我的博客

这个题目其实就是求,满足degree_in_fact(m,5)=q的最小m
但是因为q非常大,而m一定比q还大,所以m不能从1开始枚举,要先给m估值。

注意到,因为要求最小的m,所以m肯定是5的倍数。

假设m=k*5
根据上面这篇博客可以得到:

q=k+k/5+k/(5*5)+k/(5*5*5)+......<k*1.0/(1-1.0/5)=k*5/4.0

所以q*4<k*5,即k>=q*4/5+1

这个k就是我的代码中的key

代码:

#include<iostream>
using namespace std;

long long degree_in_fact(long long m, int p)
{
	if (m)return degree_in_fact(m / p, p) + m / p;
	return 0;
}

int main()
{
	long long q;
	cin >> q;
	if (q == 0)
	{
		cout << "1";
		return 0;
	}
	long long key = q * 4 / 5 + 1;
	while (degree_in_fact(key, 5) + key<q)key++;
	if (degree_in_fact(key, 5) + key == q)cout << key * 5;
	else cout << "No solution";
	return 0;
}

代码里面有q为0的特判,这是这个题目的污点。

如果没有这个特判的话,输入0会输出0,明明这个刚好符合要求,

而且所有输出的数字都是5的倍数,很好。偏偏这个题目非要这么破坏一下美感。。。



SGU - 154 Factorial(阶乘素因子次数的逆问题)

标签:

原文地址:http://blog.csdn.net/nameofcsdn/article/details/52245053

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!