難易度評価

難易度を1〜10段階で評価できます。投票はあとから変更・取り消しできます。

難易度(投票) 未投票 (0票)

投票の分布

まだ投票はありません。

  1. Lv.10票
  2. Lv.20票
  3. Lv.30票
  4. Lv.40票
  5. Lv.50票
  6. Lv.60票
  7. Lv.70票
  8. Lv.80票
  9. Lv.90票
  10. Lv.100票

難易度の目安を見る ↗

ログインして難易度を投票

外部サイトへ移動します

リンク先の URL を確認してから開いてください。

別タブで開く

Weak Goodstain Sequence

作成者 kammyu

難易度(作成者設定) Lv.4

難易度(投票) 未投票 (0票)

実行時間制限
2 秒
メモリ制限
512 MiB

元ネタ

Large となるための条件

実は、8≤N8\le N で Large となります。

解法1

愚直に実装します。オーバーフローに気を付けてください。
AiA_i から Ai+1A_{i+1} を求めるときの計算量は O(log⁡N)O(\log N) です。

解法2

全体を通して見ると、わざわざ nn 進数に変換することが無駄であるように見えます。
−1-1 の操作以外は全て基数に関する操作なので、数を桁ごとに配列で管理し、基数は別で管理すればよいです。

この解法ではオーバーフロー等を気にする必要はありません。
AiA_i から Ai+1A_{i+1} を求めるときの計算量は O(1)O(1) です。

解法2の実装例(C++)

#include <bits/stdc++.h>
using namespace std;
int main()
{
  int N;
  cin >> N;

  vector<int> num(32, 0);
  int i = 0;
  while (N)
  {
    num[i++] = N & 1;
    N >>= 1;
  }

  for (int ans = 1; ans <= 1'000'000; ans++)
  {
    int j = 0;
    while (num[j] == 0)
    {
      j++;
      if (j == 32)
      {
        cout << ans << endl;
        return 0;
      }
    }
    num[j]--;
    while (j)
      num[--j] = ans + 1;
  }
  cout << "Large" << endl;
}

Bonus:∣A∣|A| を 998244353998244353 で割った余りを求めよ。

AA の長さが有限になることの証明のお気持ち

この証明では順序数 ω\omega を用います。
ωω\omega^\omega 未満の順序数 α=ωnαn+ωn−1αn−1+⋯ωα1+α0\alpha=\omega^n\alpha_n+\omega^{n-1}\alpha_{n-1}+\cdots\omega\alpha_1+\alpha_0 について考えます。(ここで、αk<ω\alpha_k<\omega)

α\alpha に対し、f(α,i)f(\alpha,i) を α\alpha の ω\omega を全て ii に置き換えた自然数とします。
(つまり、f(α,i)=α=inαn+in−1αn−1+⋯iα1+α0f(\alpha,i)=\alpha=i^n\alpha_n+i^{n-1}\alpha_{n-1}+\cdots i\alpha_1+\alpha_0)

α\alpha が有限の場合と無限の場合で場合分けすることで、f(α,i)≤αf(\alpha,i)\le\alpha を導くことができます。

次に、α0≠0\alpha_0\ne0 のとき、つまり α\alpha が後続順序数であるとき、ii に関わらず α[i]=ωnαn+ωn−1αn−1+⋯ωα1+(α0−1)\alpha[i]=\omega^n\alpha_n+\omega^{n-1}\alpha_{n-1}+\cdots\omega\alpha_1+(\alpha_0-1) とします。
ここから、α[i]<α\alpha[i]<\alpha を得ます。

以上を組み合わせ、以下のように順序数列 BB を定めます。

  • B1B_1 は f(α,2)=Nf(\alpha,2)=N を満たす順序数のうち、αn<2\alpha_n<2 を満たす唯一の順序数
  • 2≤i2\le i について、Bi=g(Bi−1,i+1)B_i=g(B_{i-1},i+1)

すると、AA と BB の間に、Ai=f(Bi,i+1)A_i=f(B_i,i+1) という関係式が成り立ちます。
Bi+1=g(Bi)<BiB_{i+1}=g(B_i)<B_i から、BB は狭義単調減少列です。
順序数に無限降下列は存在しないので、BB は有限の長さで 00 にたどり着きます。Ai=f(Bi,i+1)≤BiA_i=f(B_i,i+1)\le B_i から、AA も有限回で 00 にたどり着くことが分かりました。

ユーザー解説

ユーザー解説を書く

ユーザー解説はまだありません。