結果

問題 No.3408 1215 Segments
コンテスト
ユーザー GOTKAKO
提出日時 2025-12-15 00:14:21
言語 C++17
(gcc 13.3.0 + boost 1.89.0)
結果
TLE  
実行時間 -
コード長 1,930 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,291 ms
コンパイル使用メモリ 204,676 KB
実行使用メモリ 10,920 KB
最終ジャッジ日時 2025-12-15 00:14:28
合計ジャッジ時間 7,171 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 25 TLE * 1 -- * 20
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    vector<vector<int>> V = {
        {4,5,6},
        {},
        {0,2,3,4,6},
        {0,2,3,5,6},
        {1,2,3,5},
        {0,1,3,5,6},
        {1,3,4,5,6},
        {0,2,5},
        {},
        {0,1,2,3,5}
    };

    auto f = [&](long long x) -> bool {
        vector<int> C(10);
        while(x) C.at(x%10)++,x /= 10;

        vector<int> ap(7);
        for(int i=0; i<10; i++) if(C.at(i)) for(auto v : V.at(i)) ap.at(v) += C.at(i);  
        for(int nine=0; nine<=C.at(9); nine++){
            vector<int> memo = ap;
            ap.at(6) += nine;
            int c = ap.at(6);
        
            int more = c-ap.at(3);
            bool ok = true;
            if(more >= 0 && more <= C.at(0)){
                ap.at(3) += more;
                ap.at(0) += C.at(0)-more,ap.at(1) += C.at(0)-more,ap.at(2) += C.at(0)-more;
                more = c-ap.at(5);
                if(more >= 0 && more <= C.at(1)){
                    ap.at(2) += more,ap.at(5) += more;
                    ap.at(1) += C.at(1)-more,ap.at(4) += C.at(1)-more;
                    more = c-ap.at(0);
                    if(more >= 0 && more <= C.at(6)){
                        ap.at(0) += more;
                        more = c-ap.at(1);
                        if(more >= 0 && more <= C.at(7)){
                            ap.at(1) += more;
                        }
                        else ok = false;
                    }
                    else ok = false;
                }
                else ok = false;
            }
            else ok = false;


            if(ok) for(int i=0; i<6; i++) if(ap.at(i) != ap.at(i+1)){ok = false; break;}
            if(ok) return true;
            ap = memo;
        }
        return false; 
    };

    long long N; cin >> N;
    while(f(N) == false) N++;
    cout << N << endl;
}
0