Tyvj1037

题目链接

分析:
这道题还是挺好的
分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;
}
原文地址:https://www.cnblogs.com/wutongtong3117/p/7673334.html