結果
| 問題 | No.873 バイナリ、ヤバいなり!w |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-09-18 23:48:35 |
| 言語 | C++14 (gcc 15.3.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 226 ms / 2,000 ms |
| + 216µs | |
| コード長 | 2,210 bytes |
| 記録 | |
| コンパイル時間 | 394 ms |
| コンパイル使用メモリ | 84,556 KB |
| 実行使用メモリ | 6,528 KB |
| 最終ジャッジ日時 | 2026-09-18 23:48:39 |
| 合計ジャッジ時間 | 3,768 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 36 |
ソースコード
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 300010;
string ans;
int n, f[N];
int main() {
// freopen("mess.in", "r", stdin);
// freopen("mess.out", "w", stdout);
scanf("%d", &n);
memset(f, 0x3f, sizeof(f));
f[0] = 0;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= sqrt(i); ++j) {
f[i] = min(f[i], j + f[i - j * j]);
}
}
int len = f[n], s = 0; // 需要拼接的长度,新的串的首位的值
bool odd_ok = true;
while (true) {
if (!len) break;
if (odd_ok) {
for (int i = 1; i <= len && i * i <= n; i += 2) {
if (f[n - i * i] + i == len) {
len -= i;
n -= i * i;
for (int j = 1; j <= i; ++j) {
if (j % 2 == 1) ans += '0';
else ans += '1';
}
break;
}
if (i >= min(len, (int) sqrt(n)) - 2) odd_ok = false;
}
}
if (!odd_ok) {
if (s == 0) {
for (int i = min(len, (int) sqrt(n)) / 2 * 2; i >= 2; i -= 2) {
if (f[n - i * i] + i == len) {
len -= i;
n -= i * i;
for (int j = 1; j <= i; ++j) {
if (j % 2 == 1) ans += '0';
else ans += '1';
}
s = 1;
break;
}
}
} else {
for (int i = 2; i <= min(len, (int) sqrt(n)) / 2 * 2; i += 2) {
if (f[n - i * i] + i == len) {
len -= i;
n -= i * i;
for (int j = 1; j <= i; ++j) {
if (j % 2 == 1) ans += '1';
else ans += '0';
}
s = 0;
break;
}
}
}
}
}
cout << ans << endl;
return 0;
}