分析:
这道题还是挺好的
分da析biao发现
每五个一组,每组的末尾0的个数相同
分别是0,1,2,3…
后面的0都是不用进行计算的
一眼高精—->只过了3个点
注意到了k<=10
看来不用高精也行,只需要在保证答案没有0的情况下每次%10^k即可
但是我们怎么去除0的存在呢
显然*10就会让答案多出一个0
而10=2*5,也就是说乘的数中,如果有2*5(10),也会产生一个多余的0
那么我们干脆把所有可能使答案出现0的元素直接去掉
我们把乘上的数中的所有5去掉,同时把相应数量的2也去掉
剩下的数不停地乘啊乘就好了
tip
最后这一步
num[++tot]=ans%10;
我强转int,炸了三个点
所以以后还是老实点吧
这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
ll mod=1;
ll ans=1;
int n,k,cnt,tot,cnt2;
ll num[15];
int main()
{
scanf("%d%d",&n,&k);
for (int i=1;i<=k;i++) mod*=10;
cnt=0;
for (int i=5;i<=n;i++)
{
int j=i;
while ((j%5)==0) cnt++,j/=5;
}
cnt2=cnt;
for (int i=2;i<=n;i++)
{
int j=i;
while (cnt&&j%5==0) cnt--,j/=5;
while (cnt2&&j%2==0) cnt2--,j/=2;
ans=(ans*(ll)j)%mod;
}
tot=0;
while (ans)
{
num[++tot]=ans%10;
ans/=10;
}
for (int i=k;i>=1;i--) printf("%lld",num[i]);
return 0;
}