最后的 是因为 和 产生的对吧,而且 的因子还比 多,因此,我们只需要知道 的因子有多少个就行了
那么我们来看 的因子有多少个
以 为例:
标红的都是有因子 的,而且是每 个就是一个含有 的因子,假如 的因子有 个,那么把这些个因子 都提取出来, 个
于是数列变成了
蓝色的就是提取了因子 的,红色就是提取之后还有因子 的
但是此时的间隔就不再是 了,而是 了
所以 个
提取之后的数列是这样的:
好现在就没有因子 了
看这个 怎么来的?后一次比前一次要多除
那么其实阔以看成每次的结果来除以
也就是:
好,到此结束
其实这个就是 求某个质因子的个数的方法,一直除,除的结果加到个数里面
那么我们最后这个数列乘出来最后就没有 了对吧
那么这个数列对 取余是不等于 的吧~
那么我们就让其对 取余,并且每次不看蓝色的数
这个时候就有规律了:
发现什么木有,有循环,而且都是
这种循环有多少个呢?
第一次除以 的时候有 个对吧,而且还有 这3个数不属于循环里的,而这三个数的乘积 想当于 ,而
第二次有 个,而且有一个 不属于第二次循环里面的,相当于
而
所以对 取余就是:
结论就是:(在对 取余的情况下)
而 所以这一坨就阔以不要了
结论变成:
然后再与左边的 约一哈:
而
所以还阔以简化一哈。。。
结论变成:
因此, 把因子 去掉后对 取余就知道是多少了,假设是
而其中 的因子比 多,那么里面肯定还有 的因子,所以对 取余为
所以得到两个同余方程:
(mod 5)
(mod 2)
那么就能得到对 取余是多少了,也就是答案
(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;
}
}