标签:
题目:
这个题目还是要用下面这个函数
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