1 条题解

  • 0
    @ 2026-4-27 9:44:04

    刚看这道题我把数据范围看成了10100于是欢乐地写了个暴力爆了0

    完了去学习了一点姿势

    进入正题

    我们想,100个数字,我们需要想个奇妙的方法,比如logn的

    我们考虑给要乘起来的n个数字每20个分成一组

    然后我们就考虑每一组都把2和5成对去掉,能去4组

    之后把原先是5的倍数去掉了5剩下的数放着不管,每组其他的数乘完了尾数就是6

    而原先是5的倍数的数,都除以5之后就是1到n/5了....

    我们用foo(x)表示x!的尾数,易证foo(x)=foo(x+20)

    那么由上面有foo(n)=6^(n/20)*foo(n/5)*foo(n%20)

    注意到6的几次方尾数都是6

    于是就可以愉快地递归计算了

    注意字符串读入,记得搞高精

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int inf=0x3f3f3f3f;
    const int N=128;
    const int f[32]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2};
    char s[N];
    int a[N];
    int main(){
        int t=5;
        int n,k,ass;
        while(t--){
            ass=1;
            scanf("%s",s);
            n=strlen(s);
            for(int i=0;i<n;i++)a[n-i-1]=s[i]-'0';
            while(n>1){
                while(a[n-1]==0)n--;
                ass=ass*f[a[1]%2*10+a[0]]%10;
                int tp=0;
                for(int i=n-1;i>=0;i--){
                    tp=tp*10+a[i];
                    a[i]=tp/5;
                    tp%=5;
                }
            }
            printf("%d\n",ass*f[a[0]]%10);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    10498
    时间
    1000ms
    内存
    8MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者