結果
| 問題 |
No.3316 Make 81181819 with only 0,1,or 8
|
| コンテスト | |
| ユーザー |
のらら
|
| 提出日時 | 2025-09-17 22:56:08 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,241 bytes |
| コンパイル時間 | 3,099 ms |
| コンパイル使用メモリ | 185,932 KB |
| 実行使用メモリ | 37,856 KB |
| 最終ジャッジ日時 | 2025-10-25 16:59:31 |
| 合計ジャッジ時間 | 31,871 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 19 WA * 3 |
ソースコード
//半分全列挙
#include <iostream>
#include <algorithm>
#include <atcoder/all>
#include <tuple>
#include <map>
using namespace std;
using namespace atcoder;
using ll = long long;
//#define endl "\n";
ll Q;
vector<pair<int,int>> v;
vector<int> nn = {1, 8};
void dfs(int val, int pos, int num){
if(pos == 8){
v.push_back({val, num});
return;
}
for(int i = 0; i < 2; i++){
for(int j = 1; j <= 3; j++){
if(val * 10 + nn[i]*j > 81181819) continue;
dfs(val * 10 + nn[i]*j, pos + 1, max(num, j));
}
}
dfs(val * 10, pos + 1, num);
}
void calc(int tar, int num, int st, vector<ll> &ret){
vector<ll> vv;
while(tar > 0){
vv.push_back(tar % 10);
tar /= 10;
}
int kakeru10 = 1;
//num<=3だから一意に決まる
for(int i = 0; i < (int)vv.size(); i++){
if(i != 0) kakeru10 *= 10;
if(vv[i] < 0){
vv[i + 1] -= 1;
vv[i] += 10;
}
if(vv[i] == 0) continue;
if(vv[i] == 1){
ret[st] += kakeru10;
continue;
}
if(vv[i] == 2){
ret[st] += kakeru10;
ret[st + 1] += kakeru10;
continue;
}
if(vv[i] == 3){
ret[st] += kakeru10;
ret[st + 1] += kakeru10;
ret[st + 2] += kakeru10;
continue;
}
if(vv[i] == 4){
ret[st] += kakeru10 * 8;
ret[st + 1] += kakeru10 * 8;
ret[st + 2] += kakeru10 * 8;
vv[i + 1] -= 2;
continue;
}
if(vv[i] == 6){
ret[st] += kakeru10 * 8;
ret[st + 1] += kakeru10 * 8;
vv[i + 1] -= 1;
continue;
}
if(vv[i] == 7){
ret[st] += kakeru10 * 8;
ret[st + 1] += kakeru10 * 8;
ret[st + 2] += kakeru10;
vv[i + 1] -= 1;
continue;
}
if(vv[i] == 8){
ret[st] += kakeru10 * 8;
continue;
}
if(vv[i] == 9){
ret[st] += kakeru10 * 8;
ret[st + 1] += kakeru10;
continue;
}
}
}
int main(){
cin >> Q;
//vの生成
dfs(0, 0, 0);
sort(v.begin(), v.end());
for(int q = 1; q <= Q; q++){
ll N;
cin >> N;
int tar = 81181819 - N;
int ret = 7;
int idx1 = 0, idx2 = 0;
for(int i = 0; i < (int)v.size(); i++){
auto [val, num] = v[i];
pair<int,int> p = {tar - val, -1};
int pos = lower_bound(v.begin(), v.end(), p) - v.begin();
if(val + v[pos].first == tar){
if(num + v[pos].second < ret){
ret = min(ret, num + v[pos].second);
idx1 = i, idx2 = pos;
}
}
}
if(ret == 7){
vector<ll> ans(7, 0);
vector<ll> vv;
int kakeru10 = 1;
while(tar > 0){
vv.push_back(tar % 10);
tar /= 10;
kakeru10 *= 10;
}
for(int i = 0; i < (int)vv.size(); i++){
kakeru10 /= 10;
int pos = 0;
if(vv[i] >= 8){
ans[pos] += kakeru10 * 8;
pos++;
vv[i] -= 8;
}
for(int j = 0; j < vv[i]; j++) ans[pos + j] += kakeru10;
}
cout << ans.size() << endl;
for(auto p: ans) cout << p << endl;
}else{
vector<ll> ans(ret, 0);
calc(v[idx1].first, v[idx1].second, 0, ans);
calc(v[idx2].first, v[idx2].second, v[idx1].second, ans);
cout << ans.size() << endl;
for(auto p: ans) cout << p << endl;
}
}
return 0;
}
のらら