最后的 0 是因为 5 2 产生的对吧,而且 2 的因子还比 5 多,因此,我们只需要知道 5 的因子有多少个就行了
那么我们来看 5 的因子有多少个
58 ! 为例:
58 ! = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
标红的都是有因子 5 的,而且是每 5 个就是一个含有 5 的因子,假如 5 的因子有 k 个,那么把这些个因子 5 都提取出来, k = 58 5 = 11
于是数列变成了

54 ! = 1 2 3 4 1 6 7 8 9 2 11 12 13 14 3 16 17 18 19 4 21 22 23 24 5 26 27 28 29 6 31 32 33 34 7 36 37 38 39 8 41 42 43 44 9 46 47 48 49 10 51 52 53 54 11 56 57 58

蓝色的就是提取了因子 5 的,红色就是提取之后还有因子 5
但是此时的间隔就不再是 5 了,而是 5 × 5 = 25
所以 k = 11 + 58 25 = 13
提取之后的数列是这样的:
54 ! = 1 2 3 4 1 6 7 8 9 2 11 12 13 14 3 16 17 18 19 4 21 22 23 24 1 26 27 28 29 6 31 32 33 34 7 36 37 38 39 8 41 42 43 44 9 46 47 48 49 2 51 52 53 54 11 56 57 58

好现在就没有因子 5
看这个 k 怎么来的?后一次比前一次要多除 5
那么其实阔以看成每次的结果来除以 5
也就是:
58 5 = 11
k + = 11

11 5 = 2
k + = 2

2 5 = 0
好,到此结束 k = 12
其实这个就是 n ! 求某个质因子的个数的方法,一直除,除的结果加到个数里面
那么我们最后这个数列乘出来最后就没有 0 了对吧
那么这个数列对 5 取余是不等于 0 的吧~
那么我们就让其对 5 取余,并且每次不看蓝色的数
这个时候就有规律了:
( 1 2 3 4 ) % 5 = 4
( 6 7 8 4 ) % 9 = ( 1 2 3 4 ) % 5 = 4
发现什么木有,有循环,而且都是 4
这种循环有多少个呢?

第一次除以 5 的时候有 10 个对吧,而且还有 ( 51 52 53 ) 这3个数不属于循环里的,而这三个数的乘积 想当于 3 ! ,而 53 % 5 = 3

第二次有 2 个,而且有一个 55 不属于第二次循环里面的,相当于 1 !
11 % 5 = 1

所以对 5 取余就是:
( 1 2 3 4 ) k
结论就是:(在对 5 取余的情况下)

2 k n ! k 5 ( 1 2 3 4 ) k

( 1 2 3 % 5 = 1 ) 所以这一坨就阔以不要了
结论变成:
2 k n ! k 5 ( 4 ) k

然后再与左边的 2 k 约一哈:
n ! k 5 ( 2 ) k

2 4 % 5 = 1
所以还阔以简化一哈。。。
结论变成:
n ! k 5 ( 2 ) k % 4

因此, n ! 把因子 5 去掉后对 5 取余就知道是多少了,假设是 x
而其中 2 的因子比 5 多,那么里面肯定还有 2 的因子,所以对 2 取余为 0
所以得到两个同余方程:
n ! 5 k x (mod 5)
n ! 5 k 0 (mod 2)
那么就能得到对 10 取余是多少了,也就是答案
r e s n ! 10 5 (mod 10)
/* 阶乘最后一位非零数 */
#include"bits/stdc++.h"
using namespace std;
int exgcd(int a, int b, int &x, int &y,int c)
{
    if (b == 0)
    {
        x = c;
        y = 0;
        return a;
    }

    int d = exgcd(b, a % b, x, y,c);
    int t = x;
    x = y;
    y = t - a / b * y;
    return d;
}
int main()
{
    long long fac[10]={1,1,2,6,24};
    long long N;
    while(cin>>N)
    {
        int k=0;
        long long ans=1;
        while(N)
        {
            k+=N/5;
            ans*=fac[N%5];
            ans%=5;
            N/=5;
        }
        k%=4;
        ans*=1<<k;
        ans%=5;
        int x,y;
        exgcd(5,2,x,y,-ans);
        int res=x*5+ans;
        res=(res%10+10)%10;
        cout<<res<<endl;
    }
}