相关题目
力扣 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=1∑k⌊2in⌋=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题得到
阶乘数 | 后缀零 |
---|---|
1 | 0 |
2 | 0 |
3 | 0 |
4 | 0 |
5 | 1 |
6 | 1 |
7 | 1 |
8 | 1 |
9 | 1 |
10 | 2 |
11 | 2 |
12 | 2 |
13 | 2 |
14 | 2 |
15 | 3 |
16 | 3 |
17 | 3 |
18 | 3 |
19 | 3 |
20 | 4 |
21 | 4 |
22 | 4 |
23 | 4 |
24 | 4 |
25 | 6 |
26 | 6 |
27 | 6 |
28 | 6 |
29 | 6 |
30 | 7 |
31 | 7 |
32 | 7 |
33 | 7 |
34 | 7 |
35 | 8 |
36 | 8 |
37 | 8 |
38 | 8 |
39 | 8 |
40 | 9 |
41 | 9 |
42 | 9 |
43 | 9 |
44 | 9 |
45 | 10 |
46 | 10 |
47 | 10 |
48 | 10 |
49 | 10 |
50 | 12 |
51 | 12 |
52 | 12 |
53 | 12 |
54 | 12 |
55 | 13 |
56 | 13 |
57 | 13 |
58 | 13 |
59 | 13 |
60 | 14 |
61 | 14 |
62 | 14 |
63 | 14 |
64 | 14 |
65 | 15 |
66 | 15 |
67 | 15 |
68 | 15 |
69 | 15 |
70 | 16 |
71 | 16 |
72 | 16 |
73 | 16 |
74 | 16 |
75 | 18 |
76 | 18 |
77 | 18 |
78 | 18 |
79 | 18 |
80 | 19 |
81 | 19 |
82 | 19 |
83 | 19 |
84 | 19 |
85 | 20 |
86 | 20 |
87 | 20 |
88 | 20 |
89 | 20 |
90 | 21 |
91 | 21 |
92 | 21 |
93 | 21 |
94 | 21 |
95 | 22 |
96 | 22 |
97 | 22 |
98 | 22 |
99 | 22 |
100 | 24 |
101 | 24 |
102 | 24 |
103 | 24 |
104 | 24 |
105 | 25 |
106 | 25 |
107 | 25 |
108 | 25 |
109 | 25 |
110 | 26 |
111 | 26 |
112 | 26 |
113 | 26 |
114 | 26 |
115 | 27 |
116 | 27 |
117 | 27 |
118 | 27 |
119 | 27 |
120 | 28 |
121 | 28 |
122 | 28 |
123 | 28 |
124 | 28 |
125 | 31 |
126 | 31 |
127 | 31 |
128 | 31 |
129 | 31 |
130 | 32 |
131 | 32 |
132 | 32 |
133 | 32 |
134 | 32 |
135 | 33 |
136 | 33 |
137 | 33 |
138 | 33 |
139 | 33 |
140 | 34 |
141 | 34 |
142 | 34 |
143 | 34 |
144 | 34 |
145 | 35 |
146 | 35 |
147 | 35 |
148 | 35 |
149 | 35 |
150 | 37 |
151 | 37 |
152 | 37 |
153 | 37 |
154 | 37 |
155 | 38 |
156 | 38 |
157 | 38 |
158 | 38 |
159 | 38 |
160 | 39 |
161 | 39 |
162 | 39 |
163 | 39 |
164 | 39 |
165 | 40 |
166 | 40 |
167 | 40 |
168 | 40 |
169 | 40 |
170 | 41 |
171 | 41 |
172 | 41 |
173 | 41 |
174 | 41 |
175 | 43 |
176 | 43 |
177 | 43 |
178 | 43 |
179 | 43 |
180 | 44 |
181 | 44 |
182 | 44 |
183 | 44 |
184 | 44 |
185 | 45 |
186 | 45 |
187 | 45 |
188 | 45 |
189 | 45 |
190 | 46 |
191 | 46 |
192 | 46 |
193 | 46 |
194 | 46 |
195 | 47 |
196 | 47 |
197 | 47 |
198 | 47 |
199 | 47 |
200 | 49 |