做题时发现了一个奇怪的问题:给出正整数 n (可能有前导0),请求出
n!
最右非零的数位的值。那么这道题肿么做呢???
USACO中有一道类似的题目,不过数据范围要小很多。。。 n 只有
106
,直接一个爆搞取模 1000000 即可但是这道题中数据范围有 10100 ,暴力的话。。。估计没有那么几个世纪是运行不出来的。。。考试的时候也没有想出什么好的方法,就暴力(暴力大法好)搞了10分。。
然后考试后,根据lyc大爷的博客 http://luoyuchu.logdown.com/posts/257468-oi-seeking-n-the-right-of-non-zero-numbers 写出了一份代码,但是又发现owaski大爷有一种更好的算法,于是继续学习
PS:其实这种算法应该说是一种数学做法,是别人从数竞书上看到的。。。
首先我们知道一点,因为 1 到
n
中 2 的因子一定比
5
的因子多,所以求 n! 的末尾 0 的个数的做法就是找
1
到 n 中有多少个
5
的因子,也就是说
Tn=[n5]+[n25]+[n125]+[n625]+[n3125]+[n15625]+⋅⋅⋅