結果
| 問題 |
No.2865 Base 10 Subsets 2
|
| コンテスト | |
| ユーザー |
Tatsu_mr
|
| 提出日時 | 2024-08-30 22:08:55 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 1,249 bytes |
| コンパイル時間 | 2,190 ms |
| コンパイル使用メモリ | 201,760 KB |
| 最終ジャッジ日時 | 2025-02-24 03:05:44 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using lint = long long;
int main() {
lint n, k;
cin >> n >> k;
if (k == 1) {
cout << 0 << endl;
return 0;
}
string s = to_string(n);
int sz = s.size();
auto f = [&](lint x) -> string {
string res = to_string(x);
string add = "";
for (int i = 0; i < sz - (int)res.size(); i++) {
add += '0';
}
res = add + res;
return res;
};
lint l = 0, r = n;
while (r - l > 1) {
lint mid = (l + r) / 2;
string t = f(mid);
vector<vector<lint>> dp(sz + 1, vector<lint>(2));
dp[0][0] = 1;
for (int i = 0; i < sz; i++) {
for (int j = 0; j < 2; j++) {
for (int k = 0; k <= s[i] - '0'; k++) {
if (j == 0 && t[i] - '0' < k) {
continue;
}
int ni = i + 1;
int nj = j | (k < t[i] - '0');
dp[ni][nj] += dp[i][j];
}
}
}
lint cnt = dp[sz][0] + dp[sz][1];
if (k <= cnt) {
r = mid;
} else {
l = mid;
}
}
cout << r << endl;
}
Tatsu_mr