[USACO3.2]阶乘问题
题目描述
也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如:
12!= 1×2×3×4×5×6×7×8×9×10×11×12=479,001,600
12的阶乘最右边的非零位为6。
写一个程序,计算N(1≤N≤50,000,000)阶乘的最右边的非零位的值。
注意:10,000,000!有2499999个零。
输入格式
仅一行包含一个正整数N。
输出格式
一个整数,表示最右边的非零位的值。
输入输出样例
输入 #1复制
12
输出 #1复制
6
算法:
暴力 暴力乘,每次保留得到的数的后7位左右(保证不出现误差)
如果每次 mod 10,会造成误差.因为当相乘后得到的是10的倍数时,mod 10 会变成0.所以每次大概mod 1000000.最后输出ans%10
原理:最后一位相乘只会影响最后一位.故只保留最后几位就行了
数学方法:有两种.第一种分析10怎么出现.发现如果两个数的因数中分别有2,5.那么相乘末尾一定有0.于是统计1~N中每个数的因数中2和5的个数.用2的个数减去5的个数(2的个数一定比5的个数多).剩下的是会对答案(即末尾的数)造成影响.之后大胆mod 10 就行了.
第二种应该是正解.
分析:N!的末尾只会是2,4,6,8(在此题中没有0).又[2,4,6,8]中任意一个数乘6,末尾仍是本身.2 * 6 = 12,末尾为2, 4 * 6 =24,末尾为4, 6 * 6=36,末尾为6,8 * 6 =48,末尾为8.又末尾数字只受末尾数字影响,如4. 4 * 6得到的末尾数字与4 * 16的末尾数字一样.又4 * 10=40,末尾数字为4(此题不要末尾0).则4 * 2 *8==4