小范围数据解法
首先应该知道:0
的产生只跟 2
和 5
有关,而在 1~n
中,2
的因子个数一定比 5
多,所以我们只需要统计出 1~n
中的 5
的因子个数,并把所有因子 5
去掉,相应的,把对应个数的因子 2
也去掉,这样剩下的部分就不会产生 0
了,可以安心食用乘积的最后一位。
#include <cstdio>
using namespace std;
const int N = 1001;
int ans[N];
int main(void) {
int n;
scanf("%d", &n);
int num5 = 0;
for ( int i = 1; i <= n; ++i ) {
ans[i] = i;
while ( ans[i] % 5 == 0 ) {
ans[i] /= 5;
++num5;
}
}
for ( int i = 1; i <= n && num5; ++i ) {
while ( ans[i] % 2 == 0 && num5 ) {
ans[i] >>= 1;
--num5;
}
}
int ret = 1;
for ( int i = 1; i <= n; ++i ) ret = ret * ans[i] % 10;
printf("%d\n", ret);
return 0;
}