Codeforcesラウンド#609(本部2)

出て戻ってDIV2準備ができて、私はフラグの前に立つと、戻って行くことはありません毎回アウト:すべてのパスがグレーアウトし、準備が整いまし缶が維持されていないアカウントCFと推定して、1つの部門に合格しました。

だから、食べ物やDIV2 ABはまた、それを書いたが、最後のdiv2onlyカードBで、実際に遊ぶ、ゼロバーストに自分のプレーに達します。(誰かが特にAB DIV2編集者注の問題に対する解決策を参照してくださいかのように)

A - 式

質問意図される:nに<= 1E7、二つの数aとbを見つけることは、差A-BがNであるように組み合わされます。

ソリューション:? 実際にポイントを送信、このようなものは何ですか?
構成= 3N、B = 2N、共通因子を含有するN、特殊なケースである場合、nが1である場合にのみ。

void test_case() {
    int n;
    scanf("%d", &n);
    if(n == 1) {
        puts("9 8");
        return;
    }
    printf("%d %d\n", 3 * n, 2 * n);
}

B - モジュロ平等

質問が意図されている:の配列に、Bは、シーケンス、任意の種類のこれら2つの配列は、次いで、位置に対応するモードでこのような差の有意性は等しいです。

ソリューション:少量のデータ、及びそれ上のすべての並べ替え千鳥位置を列挙する。比較的初心者のファンを持っているようだ、ちょうど彼は、4つの事業の意義について学ぶために死なせて。

int a[2005], b[4005];

void test_case() {
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    sort(a + 1, a + 1 + n);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &b[i]);
    sort(b + 1, b + 1 + n);
    for(int i = 1; i <= n; ++i)
        b[i + n] = b[i];
    int ans = INF;
    for(int d = 0; d < n; ++d) {
        int dif = (b[1 + d] - a[1] + m) % m;
        for(int i = 1; i <= n; ++i) {
            if((b[i + d] - a[i] + m) % m != dif) {
                dif = INF;
                break;
            }
        }
        ans = min(ans, dif);
    }
    printf("%d\n", ans);
}

彼は忍耐ので、私は私の年生のちょうど切らないで見て、すべての時間を考えて、読むために他の人のブログの多くに行くと言うように見えました。

それはちょうど彼の詳細なアイデアを伝えます:

減算処理後の対応する位置の差分がダイの下にない場合は、直接配列決定し、すべてが等しくない差を見てください。
しかし、ここで減算モジュロセンスが、少数より高い数字の存在が、しかし理由アイのであるべきであり、Biは範囲[0、M)であり、このような状況は、I + [Bその後、一度に発生することができn]を再びコピーすることができます。

:BIのような自分自身であることを意味します

0 0 1 2 3 3 4 

ここでは、下型5の意義、再びコピーされたこのBIは、と同等です。

0 0 1 2 3 3 4 | 0 0 1 2 3 3 4
0 0 1 2 3 3 4 | 5 5 6 7 8 8 9

C - ロング美しい整数

問題の意味:10進数の文字列からnビット(最初の0ではない)、tは数字の配列(最初の0ではない)ので、周期的な列のT Kが存在することと、T列> = Sストリング、およびtを構築します最小の文字列。

解決策:混乱にたくさんの練習をしたい、そして最終的には実際には非常にシンプル。kビットは、前者を表し、デジタル+1であれば、長さS N、S、およびその後の比較までの最初のkビットのデジタルコピー数回、より大きいの必須この番号sおよびsより小さい倍のコピー数を与えるとされています。

この構成は、第kビットとSはと少なくとも同じであり、周期的に繰り返さだけ後方に制限することができるので、Sよりも大きいため、最小限です。それが最後に出てくる、その後は大きな十分でない場合は、デジタルビットの後に+フロントはすでに秒よりkビット厳密に大きいから始まっています。連続キャリーのように注意してください:

6 3
299387

何文字列が999..9より大きくないかもしれないので、それは、nビットの数を得キャリーよりも長くすることはできません。

私のコンピュータは本当に遅いです、すべての後に、テストプログラムの複数のセットの後に直接書き込むコンパイルして実行することを学びます。

6 2
163456
7 2
1934569
7 2
1917165
int n, k;
char s[200005];
char t[200005];
void test_case() {
    scanf("%d%d%s", &n, &k, s + 1);
    for(int i = 1; i <= k; ++i) {
        t[i] = s[i];
        for(int j = i; j <= n; j += k)
            t[j] = t[i];
    }
    bool suc = 1;
    for(int i = 1; i <= n; ++i) {
        if(t[i] < s[i])
            suc = 0;
        else if(t[i] > s[i])
            break;
    }
    if(suc) {
        printf("%d\n", n);
        puts(t + 1);
        return;
    }
    for(int i = k; i >= 1; --i) {
        ++t[i];
        if(t[i] <= '9') {
            for(int j = i; j <= n; j += k) 
                t[j] = t[i];
            break;
        } else {
            t[i] = '0';
            for(int j = i; j <= n; j += k) 
                t[j] = t[i];
        }
    }
    printf("%d\n", n);
    puts(t + 1);
}

おすすめ

転載: www.cnblogs.com/KisekiPurin2019/p/12078782.html