阶乘的后缀零数量

相关题目

力扣 172.阶乘后的零

给定一个整数 n ,返回 n! 结果中尾随零的数量。
提示 n! = n * (n - 1) * (n - 2) * … * 3 * 2 * 1

力扣 793.阶乘函数后K个零

f(x) 是 x! 末尾是 0 的数量。回想一下 x! = 1 * 2 * 3 * … * x,且 0! = 1 。
例如, f(3) = 0 ,因为 3! = 6 的末尾没有 0 ;而 f(11) = 2 ,因为 11!= 39916800 末端有 2 个 0 。
给定 k,找出返回能满足 f(x) = k 的非负整数 x 的数量。

2023年第十四届蓝桥杯省赛JavaB组第一题

【问题描述】
令 S = 1! + 2! + 3! + . . . + 202320232023! ,求 S的末尾 9 位数字。 提示:答案首位不为 0。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分


思路

找规律

我们不妨先看一下阶乘后缀零数量表(表在此文最后),找找规律
不难看出,基本的规律是每五个数,后缀零的数量加1
但是有例外:
25,50,75,100…的后缀零数量加2 —— 25(5^2)的倍数额外加1
125 后缀零数量加3 —— 125(5^3)的倍数额外加1

规律到这里大概可以看出来了:

n!后缀零数量: n / 5 + n / 5 2 + n / 5 3 + . . . + n / 5 k n/5 + n/5^2 + n/5^3 +... +n/5^k n/5+n/52+n/53+...+n/5k n > 5 k n>5^k n>5k

如果没看出来这个规律也无所谓,接下来我们来从数学角度推一下这个规律


推理

后缀零的产生,根本上是因为分解质因数能分出2和5,2*5 = 10,就会致使后缀零的数量增加。
显而易见,因数分解出2的个数必定比5的个数多,所以我们只需要找这个数能分解出多少个5就可以了

这个数能分出来几个5呢?

一、能分出1个5的必定是5的倍数
二、能分出2个5的必定是5^2的倍数

所以只要确定这个数中有几个5,25,…,5^k的倍数即可

怎么确定能有几个5^k的倍数呢?
n / 5 k n/5^k n/5k
为什么呢?
给大家举个例子就明白了
23中有几个5的倍数呢
5,10,15,20共四个,不超过23的最大5的倍数是20,5*4 = 20,所以23中有4个5的倍数

而5^k 的倍数必定是 5 ^(k-1)的倍数
所以综上我们已经可以推导出来这个通项公式了

∑ i = 1 k ⌊ n 2 i ⌋ = n / 5 + n / 5 2 + n / 5 3 + . . . + n / 5 k \sum_{i=1}^{k} \left \lfloor \frac{n}{2^i} \right \rfloor = n/5 + n/5^2 + n/5^3 +... +n/5^k i=1k2in=n/5+n/52+n/53+...+n/5k


附:题目答案代码

力扣172

class Solution {
    public int trailingZeroes(int n) {
        int a = 1;
        int ans = 0;
        while(a<n){
            a*=5;
            ans+=n/a;
        }
        return ans;
    }
}

力扣793

class Solution {
    public int preimageSizeFZF(int k) {
        int zero=1;
    while(zero<k)
        zero=5*zero+1; //这个数的下一个5^i对应多少个零
    while(zero>1){
        if(zero-1==k)//比对应数少1必定不是合理的后缀0个数
            return 0;
        //去5^(i-1)找
        zero=(zero-1)/5;
        k%=zero;
    }
    return 5;
    }
}

看懂这个题解首先要给后缀0的个数分档
第一档 5! —— 1
第二档 25!—— 6 (5,25)阶乘数每多5,后缀0数量加1
第三档 125! —— 31 (25,125)这期间阶乘数每多25,后缀0数量加6

这里面可以再分五个为一组,一组中的五个数的后缀零个数是相同的,所以答案不是5就是0
这个题中第一个while就是确定所给0个数的下一个档的零个数是多少
第二个while循环就是逐层缩小范围,看看是否满足所给规则


2023年第十四届蓝桥杯省赛JavaB组第一题

import java.math.BigInteger;
public class Main{
    public static void main(String[]args) {
        BigInteger sum = BigInteger.ZERO;
        int i = 1;
        while(trailingZeroes(i)<9){
            sum = sum.add(fac(i));
            i++;
        }
        System.out.println(sum);
        System.out.println(sum.mod(BigInteger.valueOf(1000000000)));
    }
    public static BigInteger fac(int n){
        if(n==1)
            return BigInteger.ONE;
        return BigInteger.valueOf(n).multiply(fac(n-1));
    }
    public static int trailingZeroes(int n) {
        int a = 1;
        int ans = 0;
        while(a<n){
            a*=5;
            ans+=n/a;
        }
        return ans;
    }
}

最终答案:420940313


附:1~200后缀零数量表

这个表大家可以通过遍历力扣173题得到

阶乘数后缀零
10
20
30
40
51
61
71
81
91
102
112
122
132
142
153
163
173
183
193
204
214
224
234
244
256
266
276
286
296
307
317
327
337
347
358
368
378
388
398
409
419
429
439
449
4510
4610
4710
4810
4910
5012
5112
5212
5312
5412
5513
5613
5713
5813
5913
6014
6114
6214
6314
6414
6515
6615
6715
6815
6915
7016
7116
7216
7316
7416
7518
7618
7718
7818
7918
8019
8119
8219
8319
8419
8520
8620
8720
8820
8920
9021
9121
9221
9321
9421
9522
9622
9722
9822
9922
10024
10124
10224
10324
10424
10525
10625
10725
10825
10925
11026
11126
11226
11326
11426
11527
11627
11727
11827
11927
12028
12128
12228
12328
12428
12531
12631
12731
12831
12931
13032
13132
13232
13332
13432
13533
13633
13733
13833
13933
14034
14134
14234
14334
14434
14535
14635
14735
14835
14935
15037
15137
15237
15337
15437
15538
15638
15738
15838
15938
16039
16139
16239
16339
16439
16540
16640
16740
16840
16940
17041
17141
17241
17341
17441
17543
17643
17743
17843
17943
18044
18144
18244
18344
18444
18545
18645
18745
18845
18945
19046
19146
19246
19346
19446
19547
19647
19747
19847
19947
20049
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值