Welcome to Subscribe On Youtube
3272. Find the Count of Good Integers
Description
You are given two positive integers n
and k
.
An integer x
is called k-palindromic if:
x
is a palindrome.x
is divisible byk
.
An integer is called good if its digits can be rearranged to form a k-palindromic integer. For example, for k = 2
, 2020 can be rearranged to form the k-palindromic integer 2002, whereas 1010 cannot be rearranged to form a k-palindromic integer.
Return the count of good integers containing n
digits.
Note that any integer must not have leading zeros, neither before nor after rearrangement. For example, 1010 cannot be rearranged to form 101.
Example 1:
Input: n = 3, k = 5
Output: 27
Explanation:
Some of the good integers are:
- 551 because it can be rearranged to form 515.
- 525 because it is already k-palindromic.
Example 2:
Input: n = 1, k = 4
Output: 2
Explanation:
The two good integers are 4 and 8.
Example 3:
Input: n = 5, k = 6
Output: 2468
Constraints:
1 <= n <= 10
1 <= k <= 9
Solutions
Solution 1
-
class Solution { public long countGoodIntegers(int n, int k) { long[] fac = new long[n + 1]; fac[0] = 1; for (int i = 1; i <= n; i++) { fac[i] = fac[i - 1] * i; } long ans = 0; Set<String> vis = new HashSet<>(); int base = (int) Math.pow(10, (n - 1) / 2); for (int i = base; i < base * 10; i++) { String s = String.valueOf(i); StringBuilder sb = new StringBuilder(s).reverse(); s += sb.substring(n % 2); if (Long.parseLong(s) % k != 0) { continue; } char[] arr = s.toCharArray(); Arrays.sort(arr); String t = new String(arr); if (vis.contains(t)) { continue; } vis.add(t); int[] cnt = new int[10]; for (char c : arr) { cnt[c - '0']++; } long res = (n - cnt[0]) * fac[n - 1]; for (int x : cnt) { res /= fac[x]; } ans += res; } return ans; } }
-
class Solution { public: long long countGoodIntegers(int n, int k) { vector<long long> fac(n + 1, 1); for (int i = 1; i <= n; ++i) { fac[i] = fac[i - 1] * i; } long long ans = 0; unordered_set<string> vis; int base = pow(10, (n - 1) / 2); for (int i = base; i < base * 10; ++i) { string s = to_string(i); string rev = s; reverse(rev.begin(), rev.end()); s += rev.substr(n % 2); if (stoll(s) % k) { continue; } string t = s; sort(t.begin(), t.end()); if (vis.count(t)) { continue; } vis.insert(t); vector<int> cnt(10); for (char c : t) { cnt[c - '0']++; } long long res = (n - cnt[0]) * fac[n - 1]; for (int x : cnt) { res /= fac[x]; } ans += res; } return ans; } };
-
class Solution: def countGoodIntegers(self, n: int, k: int) -> int: fac = [factorial(i) for i in range(n + 1)] ans = 0 vis = set() base = 10 ** ((n - 1) // 2) for i in range(base, base * 10): s = str(i) s += s[::-1][n % 2 :] if int(s) % k: continue t = "".join(sorted(s)) if t in vis: continue vis.add(t) cnt = Counter(t) res = (n - cnt["0"]) * fac[n - 1] for x in cnt.values(): res //= fac[x] ans += res return ans
-
func factorial(n int) []int64 { fac := make([]int64, n+1) fac[0] = 1 for i := 1; i <= n; i++ { fac[i] = fac[i-1] * int64(i) } return fac } func countGoodIntegers(n int, k int) (ans int64) { fac := factorial(n) vis := make(map[string]bool) base := int(math.Pow(10, float64((n-1)/2))) for i := base; i < base*10; i++ { s := strconv.Itoa(i) rev := reverseString(s) s += rev[n%2:] num, _ := strconv.ParseInt(s, 10, 64) if num%int64(k) != 0 { continue } bs := []byte(s) slices.Sort(bs) t := string(bs) if vis[t] { continue } vis[t] = true cnt := make([]int, 10) for _, c := range t { cnt[c-'0']++ } res := (int64(n) - int64(cnt[0])) * fac[n-1] for _, x := range cnt { res /= fac[x] } ans += res } return } func reverseString(s string) string { t := []byte(s) for i, j := 0, len(t)-1; i < j; i, j = i+1, j-1 { t[i], t[j] = t[j], t[i] } return string(t) }
-
function factorial(n: number): number[] { const fac = Array(n + 1).fill(1); for (let i = 1; i <= n; i++) { fac[i] = fac[i - 1] * i; } return fac; } function reverseString(s: string): string { return s.split('').reverse().join(''); } function countGoodIntegers(n: number, k: number): number { const fac = factorial(n); let ans = 0; const vis = new Set<string>(); const base = Math.pow(10, Math.floor((n - 1) / 2)); for (let i = base; i < base * 10; i++) { let s = i.toString(); const rev = reverseString(s); if (n % 2 === 1) { s += rev.substring(1); } else { s += rev; } const num = parseInt(s, 10); if (num % k !== 0) { continue; } const bs = Array.from(s).sort(); const t = bs.join(''); if (vis.has(t)) { continue; } vis.add(t); const cnt = Array(10).fill(0); for (const c of t) { cnt[+c]++; } let res = (n - cnt[0]) * fac[n - 1]; for (const x of cnt) { res /= fac[x]; } ans += res; } return ans; }