2081 - Sum of k-Mirror Numbers
info
- 문제 보기: 2081 - Sum of k-Mirror Numbers
- 소요 시간: 36분 8초
- 풀이 언어:
java - 체감 난이도: 3️⃣~4️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
구현
풀이 코드
info
- 메모리: 44390 KB
- 시간: 448 ms
class Solution {
int k, n;
List<Long> numList;
// 1. gen base-k palindrome
// 2. convert to base-10 & check palindrome
public void gen(List<Integer> prefix, int remain, boolean isOdd) throws Exception {
if (remain == 0) {
List<Integer> digits = new ArrayList<>(prefix);
int mid = isOdd ? prefix.size()-1 : prefix.size();
for (int i = mid-1; i > -1; --i) {
digits.add(prefix.get(i));
}
long num10 = 0;
for (int d : digits) num10 = num10 * k + d;
String s = Long.toString(num10);
for (int l = 0, r = s.length()-1; l < r; ++l, --r)
if (s.charAt(l) != s.charAt(r)) return;
numList.add(num10);
if (numList.size() >= n) throw new Exception();
return;
}
for (int i = 0; i < k; ++i) {
prefix.add(i);
gen(prefix, remain-1, isOdd);
prefix.remove(prefix.size()-1);
}
}
public long kMirror(int k, int n) {
this.k = k;
this.n = n;
numList = new ArrayList<>();
try {
for (int len = 1; ; ++len) {
int half = (len + 1) >> 1;
for (int i = 1; i < k; ++i) {
List<Integer> prefix = new ArrayList<>();
prefix.add(i);
gen(prefix, half-1, (len&1)==1);
}
}
} catch (Exception e) {}
long ans = 0;
for (int i = 0; i < n; ++i) ans += numList.get(i);
return ans;
}
}