Skip to content

Commit 8085e67

Browse files
authored
update: 添加问题“3272.统计好整数的数目”的代码和题解(#868)
* clean: +readme Signed-off-by: LetMeFly666 <[email protected]> * words: en+jp Signed-off-by: LetMeFly666 <[email protected]> * 3273: WA.cpp Signed-off-by: LetMeFly666 <[email protected]> * 3272: WA.cpp(#867) todo: rename Signed-off-by: LetMeFly666 <[email protected]> * 3272: rename 3273->3272(#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: fix case n=1 (#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: fu*k 题目中说的是一个整数**重新排列**后能得到k回文整数(#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: 将错再错-字符串前半段的枚举包含奇数长度的中间值 (#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: 将错再错-字符串前半段的枚举包含奇数长度的中间值 (#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: refactor-isOk不再传递参数k (#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: WA.cpp - ALL0(#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: WA.cpp(fix.x2)(#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: WA.cpp(48/90)(#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: WIP(#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: diff(debug) 知道原因了!不能先visited再ifOk,必须ok了才能visited(#867) 总之就是不能将一个!isOk的字符串标记为visited Signed-off-by: LetMeFly666 <[email protected]> * 3272: AC.cpp - AC,21.21%,93.94%(#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: WA.py - AC,21.21%,93.94%(#867) * 3272: AC.py - AC,32.00%,100.00%(#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: CE.java(#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: AC.java - AC,20.83%,16.67%(#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: AC.java - AC,25.00%,75.00%,一遍过(#867) Signed-off-by: LetMeFly666 <[email protected]> * 3272: docs(题解) + AC.All (#867) + cpp.踩坑记录注释 Signed-off-by: LetMeFly666 <[email protected]> * update: 添加问题“3272.统计好整数的数目”的代码和题解(#868) Signed-off-by: LetMeFly666 <[email protected]> --------- Signed-off-by: LetMeFly666 <[email protected]>
1 parent 1fdc2f2 commit 8085e67

11 files changed

+816
-27
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* @Author: LetMeFly
3+
* @Date: 2025-04-12 07:51:15
4+
* @LastEditors: LetMeFly.xyz
5+
* @LastEditTime: 2025-04-12 13:01:46
6+
* @Description: AC,21.21%,93.94%
7+
*/
8+
#if defined(_WIN32) || defined(__APPLE__)
9+
#include "_[1,2]toVector.h"
10+
#endif
11+
12+
/*
13+
1 -> 1-9
14+
2 -> 1-9
15+
3 -> 10->99
16+
4 -> 10->99
17+
5 -> 100->999
18+
6 -> 100->999
19+
20+
n -> [10^((n-1)/2-1), 10^((n-1)/2)-1)
21+
*/
22+
typedef long long ll;
23+
24+
class Solution {
25+
private:
26+
int k;
27+
unordered_set<string> visited;
28+
vector<int> factor;
29+
int times[10];
30+
31+
void initFactor(int n) {
32+
factor.resize(n + 1);
33+
factor[0] = 1;
34+
for (int i = 1; i <= n; i++) {
35+
factor[i] = factor[i - 1] * i;
36+
}
37+
}
38+
39+
bool ifVisited(string s) {
40+
sort(s.begin(), s.end());
41+
if (visited.count(s)) {
42+
return true;
43+
}
44+
visited.insert(s);
45+
return false;
46+
}
47+
48+
bool isOk(string& s) {
49+
ll val = stoll(s);
50+
// printf("%s: %d\n", s.c_str(), val % k == 0); // *****
51+
return val % k == 0;
52+
};
53+
54+
ll calc(string& s) {
55+
memset(times, 0, sizeof(times));
56+
for (char c : s) {
57+
times[c - '0']++;
58+
}
59+
ll ans = (s.size() - times[0]) * factor[s.size() - 1];
60+
for (int i = 0; i < 10; i++) {
61+
ans /= factor[times[i]];
62+
}
63+
return ans;
64+
}
65+
public:
66+
ll countGoodIntegers(int n, int k) {
67+
initFactor(n);
68+
this->k = k;
69+
ll ans = 0;
70+
for (int start = pow(10, (n - 1) / 2), end = start * 10; start < end; start++) {
71+
string prefix = to_string(start), suffix = prefix.substr(0, prefix.size() - n % 2);
72+
reverse(suffix.begin(), suffix.end());
73+
string thisNum = prefix + suffix;
74+
if (isOk(thisNum) && !ifVisited(thisNum)) { // 注意ifVisited会将thisNum加入哈希表的话记得先判断isOk再判断ifVisited
75+
// printf("ans: %lld, calc(%s): %lld, ans = ans + calc(%s) = %lld\n", ans, thisNum.c_str(), calc(thisNum), thisNum.c_str(), ans + calc(thisNum)); // ****
76+
ans += calc(thisNum);
77+
}
78+
}
79+
return ans;
80+
}
81+
};
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
/*
2+
* @Author: LetMeFly
3+
* @Date: 2025-04-12 11:14:05
4+
* @LastEditors: LetMeFly.xyz
5+
* @LastEditTime: 2025-04-12 11:40:36
6+
* @Description: AC,25.00%,75.00%,一遍过
7+
*/
8+
package main
9+
10+
import (
11+
"math"
12+
"strconv"
13+
"sort"
14+
"strings"
15+
)
16+
17+
type solution3273 struct{
18+
n, k int
19+
factor []int
20+
visited map[string]bool
21+
}
22+
23+
func init3273(n int, k int) *solution3273 {
24+
ans := &solution3273{
25+
n: n,
26+
k: k,
27+
factor: make([]int, n + 1),
28+
visited : map[string]bool{},
29+
}
30+
ans.factor[0] = 1
31+
for i := 1; i <= n; i++ {
32+
ans.factor[i] = ans.factor[i - 1] * i
33+
}
34+
return ans
35+
}
36+
37+
func (t* solution3273) isOk(s string) bool {
38+
val, _ := strconv.Atoi(s)
39+
return val % t.k == 0
40+
}
41+
42+
func (t* solution3273) ifVisited(s string) bool {
43+
array := strings.Split(s, "")
44+
sort.Strings(array)
45+
s = strings.Join(array, "")
46+
if t.visited[s] {
47+
return true
48+
}
49+
t.visited[s] = true
50+
return false
51+
}
52+
53+
func (t* solution3273) calc(s string) (ans int64) {
54+
times := [10]int{}
55+
for i, _ := range s {
56+
times[s[i] - '0']++
57+
}
58+
ans = int64(t.n - times[0]) * int64(t.factor[t.n - 1])
59+
for _, v := range times {
60+
ans /= int64(t.factor[v])
61+
}
62+
return
63+
}
64+
65+
func (t* solution3273) getFullS(prefix string) string {
66+
suffix := []byte(prefix)
67+
if t.n % 2 == 1 {
68+
suffix = suffix[:len(suffix) - 1]
69+
}
70+
for i := 0; i < len(suffix) / 2; i++ {
71+
suffix[i], suffix[len(suffix) - i - 1] = suffix[len(suffix) - i - 1], suffix[i]
72+
}
73+
return prefix + string(suffix)
74+
}
75+
76+
func countGoodIntegers(n int, k int) (ans int64) {
77+
solution := init3273(n, k)
78+
from := int(math.Pow10((n - 1) / 2))
79+
to := from * 10
80+
for i := from; i < to; i++ {
81+
s := solution.getFullS(strconv.Itoa(i))
82+
if solution.isOk(s) && !solution.ifVisited(s) {
83+
ans += solution.calc(s)
84+
}
85+
}
86+
return
87+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* @Author: LetMeFly
3+
* @Date: 2025-04-12 10:53:42
4+
* @LastEditors: LetMeFly.xyz
5+
* @LastEditTime: 2025-04-12 11:13:08
6+
*/
7+
import java.util.Set;
8+
import java.util.HashSet;
9+
// import java.lang.StringBuilder; // 默认自动导入 无需手动导入
10+
import java.util.Arrays;
11+
12+
class Solution {
13+
private int k;
14+
private int[] factor;
15+
private Set<String> visited = new HashSet<>();
16+
17+
private boolean isOk(String s) {
18+
return Long.parseLong(s) % k == 0;
19+
}
20+
21+
private boolean ifVisited(String s) {
22+
char[] array = s.toCharArray();
23+
Arrays.sort(array);
24+
String sorted = new String(array);
25+
return !visited.add(sorted);
26+
}
27+
28+
private long calc(String s) {
29+
int[] times = new int[10];
30+
for (char c : s.toCharArray()) {
31+
times[c - '0']++;
32+
}
33+
long ans = (s.length() - times[0]) * factor[s.length() - 1];
34+
for (int i = 0; i < 10; i++) {
35+
ans /= factor[times[i]];
36+
}
37+
return ans;
38+
}
39+
40+
public long countGoodIntegers(int n, int k) {
41+
this.k = k;
42+
factor = new int[n + 1];
43+
factor[0] = 1;
44+
for (int i = 1; i <= n; i++) {
45+
factor[i] = factor[i - 1] * i;
46+
}
47+
long ans = 0;
48+
for (int from = (int)Math.pow(10, (n - 1) / 2), to = from * 10; from < to; from++) {
49+
String prefix = String.valueOf(from);
50+
String suffix = new StringBuilder(prefix).reverse().substring(n % 2);
51+
String s = prefix + suffix;
52+
if (isOk(s) && !ifVisited(s)) {
53+
ans += calc(s);
54+
}
55+
}
56+
return ans;
57+
}
58+
}
59+
60+
/*
61+
API:
62+
63+
java 子字符串
64+
反转字符串
65+
整数转字符串
66+
字符串拼接
67+
字符串转整数
68+
*/
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
'''
2+
Author: LetMeFly
3+
Date: 2025-04-12 09:44:25
4+
LastEditors: LetMeFly.xyz
5+
LastEditTime: 2025-04-12 10:52:36
6+
Description: 中间终中断了下
7+
'''
8+
from collections import Counter
9+
10+
class Solution:
11+
def isOk(self, s: str) -> bool:
12+
return int(s) % self.k == 0
13+
14+
def ifVisited(self, s: str) -> bool:
15+
s = ''.join(sorted(s))
16+
if s in self.visited:
17+
return True
18+
self.visited.add(s)
19+
return False
20+
21+
def calc(self, s: str) -> int:
22+
times = Counter(s)
23+
ans = (len(s) - times['0']) * self.factor[len(s) - 1]
24+
for _, val in times.items():
25+
ans //= self.factor[val]
26+
return ans
27+
28+
def countGoodIntegers(self, n: int, k: int) -> int:
29+
self.k = k
30+
self.factor = [1] * (n + 1)
31+
for i in range(1, n + 1):
32+
self.factor[i] = self.factor[i - 1] * i
33+
self.visited = set()
34+
base = pow(10, (n - 1) // 2)
35+
ans = 0
36+
for i in range(base, base * 10):
37+
prefix = str(i)
38+
s = prefix + prefix[::-1][n % 2:]
39+
if self.isOk(s) and not self.ifVisited(s):
40+
ans += self.calc(s)
41+
return ans
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
ans: 0, calc(20202): 6, ans = ans + calc(20202) = 6
2+
ans: 6, calc(20502): 18, ans = ans + calc(20502) = 24
3+
ans: 24, calc(20802): 18, ans = ans + calc(20802) = 42
4+
ans: 42, calc(21012): 24, ans = ans + calc(21012) = 66
5+
ans: 66, calc(21312): 30, ans = ans + calc(21312) = 96
6+
ans: 96, calc(21612): 30, ans = ans + calc(21612) = 126
7+
ans: 126, calc(21912): 30, ans = ans + calc(21912) = 156
8+
ans: 156, calc(22122): 5, ans = ans + calc(22122) = 161
9+
ans: 161, calc(22422): 5, ans = ans + calc(22422) = 166
10+
ans: 166, calc(22722): 5, ans = ans + calc(22722) = 171
11+
ans: 171, calc(23232): 10, ans = ans + calc(23232) = 181
12+
ans: 181, calc(23532): 30, ans = ans + calc(23532) = 211
13+
ans: 211, calc(23832): 30, ans = ans + calc(23832) = 241
14+
ans: 241, calc(24042): 24, ans = ans + calc(24042) = 265
15+
ans: 265, calc(24342): 30, ans = ans + calc(24342) = 295
16+
ans: 295, calc(24642): 30, ans = ans + calc(24642) = 325
17+
ans: 325, calc(24942): 30, ans = ans + calc(24942) = 355
18+
ans: 355, calc(25152): 30, ans = ans + calc(25152) = 385
19+
ans: 385, calc(25452): 30, ans = ans + calc(25452) = 415
20+
ans: 415, calc(25752): 30, ans = ans + calc(25752) = 445
21+
ans: 445, calc(26262): 10, ans = ans + calc(26262) = 455
22+
ans: 455, calc(26562): 30, ans = ans + calc(26562) = 485
23+
ans: 485, calc(26862): 30, ans = ans + calc(26862) = 515
24+
ans: 515, calc(27072): 24, ans = ans + calc(27072) = 539
25+
ans: 539, calc(27372): 30, ans = ans + calc(27372) = 569
26+
ans: 569, calc(27672): 30, ans = ans + calc(27672) = 599
27+
ans: 599, calc(27972): 30, ans = ans + calc(27972) = 629
28+
ans: 629, calc(28182): 30, ans = ans + calc(28182) = 659
29+
ans: 659, calc(28482): 30, ans = ans + calc(28482) = 689
30+
ans: 689, calc(28782): 30, ans = ans + calc(28782) = 719
31+
ans: 719, calc(29292): 10, ans = ans + calc(29292) = 729
32+
ans: 729, calc(29592): 30, ans = ans + calc(29592) = 759
33+
ans: 759, calc(29892): 30, ans = ans + calc(29892) = 789
34+
ans: 789, calc(40104): 18, ans = ans + calc(40104) = 807
35+
ans: 807, calc(40404): 6, ans = ans + calc(40404) = 813
36+
ans: 813, calc(40704): 18, ans = ans + calc(40704) = 831
37+
ans: 831, calc(41214): 30, ans = ans + calc(41214) = 861
38+
ans: 861, calc(41514): 30, ans = ans + calc(41514) = 891
39+
ans: 891, calc(41814): 30, ans = ans + calc(41814) = 921
40+
ans: 921, calc(43134): 30, ans = ans + calc(43134) = 951
41+
ans: 951, calc(43434): 10, ans = ans + calc(43434) = 961
42+
ans: 961, calc(43734): 30, ans = ans + calc(43734) = 991
43+
ans: 991, calc(44244): 5, ans = ans + calc(44244) = 996
44+
ans: 996, calc(44544): 5, ans = ans + calc(44544) = 1001
45+
ans: 1001, calc(44844): 5, ans = ans + calc(44844) = 1006
46+
ans: 1006, calc(45054): 24, ans = ans + calc(45054) = 1030
47+
ans: 1030, calc(45354): 30, ans = ans + calc(45354) = 1060
48+
ans: 1060, calc(45654): 30, ans = ans + calc(45654) = 1090
49+
ans: 1090, calc(45954): 30, ans = ans + calc(45954) = 1120
50+
ans: 1120, calc(46164): 30, ans = ans + calc(46164) = 1150
51+
ans: 1150, calc(46464): 10, ans = ans + calc(46464) = 1160
52+
ans: 1160, calc(46764): 30, ans = ans + calc(46764) = 1190
53+
ans: 1190, calc(47274): 30, ans = ans + calc(47274) = 1220
54+
ans: 1220, calc(47574): 30, ans = ans + calc(47574) = 1250
55+
ans: 1250, calc(47874): 30, ans = ans + calc(47874) = 1280
56+
ans: 1280, calc(48084): 24, ans = ans + calc(48084) = 1304
57+
ans: 1304, calc(48384): 30, ans = ans + calc(48384) = 1334
58+
ans: 1334, calc(48684): 30, ans = ans + calc(48684) = 1364
59+
ans: 1364, calc(48984): 30, ans = ans + calc(48984) = 1394
60+
ans: 1394, calc(49194): 30, ans = ans + calc(49194) = 1424
61+
ans: 1424, calc(49494): 10, ans = ans + calc(49494) = 1434
62+
ans: 1434, calc(49794): 30, ans = ans + calc(49794) = 1464
63+
ans: 1464, calc(60006): 4, ans = ans + calc(60006) = 1468
64+
ans: 1468, calc(60306): 18, ans = ans + calc(60306) = 1486
65+
ans: 1486, calc(60606): 6, ans = ans + calc(60606) = 1492
66+
ans: 1492, calc(60906): 18, ans = ans + calc(60906) = 1510
67+
ans: 1510, calc(61116): 10, ans = ans + calc(61116) = 1520
68+
ans: 1520, calc(61416): 30, ans = ans + calc(61416) = 1550
69+
ans: 1550, calc(61716): 30, ans = ans + calc(61716) = 1580
70+
ans: 1580, calc(63036): 24, ans = ans + calc(63036) = 1604
71+
ans: 1604, calc(63336): 10, ans = ans + calc(63336) = 1614
72+
ans: 1614, calc(63636): 10, ans = ans + calc(63636) = 1624
73+
ans: 1624, calc(63936): 30, ans = ans + calc(63936) = 1654
74+
ans: 1654, calc(65256): 30, ans = ans + calc(65256) = 1684
75+
ans: 1684, calc(65556): 10, ans = ans + calc(65556) = 1694
76+
ans: 1694, calc(65856): 30, ans = ans + calc(65856) = 1724
77+
ans: 1724, calc(66066): 4, ans = ans + calc(66066) = 1728
78+
ans: 1728, calc(66366): 5, ans = ans + calc(66366) = 1733
79+
ans: 1733, calc(66666): 1, ans = ans + calc(66666) = 1734
80+
ans: 1734, calc(66966): 5, ans = ans + calc(66966) = 1739
81+
ans: 1739, calc(67176): 30, ans = ans + calc(67176) = 1769
82+
ans: 1769, calc(67476): 30, ans = ans + calc(67476) = 1799
83+
ans: 1799, calc(67776): 10, ans = ans + calc(67776) = 1809
84+
ans: 1809, calc(68286): 30, ans = ans + calc(68286) = 1839
85+
ans: 1839, calc(68586): 30, ans = ans + calc(68586) = 1869
86+
ans: 1869, calc(68886): 10, ans = ans + calc(68886) = 1879
87+
ans: 1879, calc(69096): 24, ans = ans + calc(69096) = 1903
88+
ans: 1903, calc(69396): 30, ans = ans + calc(69396) = 1933
89+
ans: 1933, calc(69696): 10, ans = ans + calc(69696) = 1943
90+
ans: 1943, calc(69996): 10, ans = ans + calc(69996) = 1953
91+
ans: 1953, calc(80208): 18, ans = ans + calc(80208) = 1971
92+
ans: 1971, calc(80508): 18, ans = ans + calc(80508) = 1989
93+
ans: 1989, calc(80808): 6, ans = ans + calc(80808) = 1995
94+
ans: 1995, calc(81018): 24, ans = ans + calc(81018) = 2019
95+
ans: 2019, calc(81318): 30, ans = ans + calc(81318) = 2049
96+
ans: 2049, calc(81618): 30, ans = ans + calc(81618) = 2079
97+
ans: 2079, calc(81918): 30, ans = ans + calc(81918) = 2109
98+
ans: 2109, calc(83238): 30, ans = ans + calc(83238) = 2139
99+
ans: 2139, calc(83538): 30, ans = ans + calc(83538) = 2169
100+
ans: 2169, calc(83838): 10, ans = ans + calc(83838) = 2179
101+
ans: 2179, calc(85158): 30, ans = ans + calc(85158) = 2209
102+
ans: 2209, calc(85458): 30, ans = ans + calc(85458) = 2239
103+
ans: 2239, calc(85758): 30, ans = ans + calc(85758) = 2269
104+
ans: 2269, calc(87078): 24, ans = ans + calc(87078) = 2293
105+
ans: 2293, calc(87378): 30, ans = ans + calc(87378) = 2323
106+
ans: 2323, calc(87678): 30, ans = ans + calc(87678) = 2353
107+
ans: 2353, calc(87978): 30, ans = ans + calc(87978) = 2383
108+
ans: 2383, calc(88188): 5, ans = ans + calc(88188) = 2388
109+
ans: 2388, calc(88488): 5, ans = ans + calc(88488) = 2393
110+
ans: 2393, calc(88788): 5, ans = ans + calc(88788) = 2398
111+
ans: 2398, calc(89298): 30, ans = ans + calc(89298) = 2428
112+
ans: 2428, calc(89598): 30, ans = ans + calc(89598) = 2458
113+
ans: 2458, calc(89898): 10, ans = ans + calc(89898) = 2468

0 commit comments

Comments
 (0)