結果

問題 No.2156 ぞい文字列
ユーザー atug tokyoatug tokyo
提出日時 2022-12-10 00:10:34
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 2 ms / 2,000 ms
コード長 1,413 bytes
コンパイル時間 2,066 ms
コンパイル使用メモリ 208,680 KB
実行使用メモリ 6,820 KB
最終ジャッジ日時 2024-10-14 23:13:23
合計ジャッジ時間 3,011 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,820 KB
testcase_01 AC 2 ms
6,816 KB
testcase_02 AC 1 ms
6,816 KB
testcase_03 AC 2 ms
6,816 KB
testcase_04 AC 2 ms
6,816 KB
testcase_05 AC 2 ms
6,816 KB
testcase_06 AC 2 ms
6,816 KB
testcase_07 AC 2 ms
6,820 KB
testcase_08 AC 1 ms
6,816 KB
testcase_09 AC 2 ms
6,816 KB
testcase_10 AC 1 ms
6,816 KB
testcase_11 AC 2 ms
6,816 KB
testcase_12 AC 2 ms
6,816 KB
testcase_13 AC 2 ms
6,816 KB
testcase_14 AC 2 ms
6,820 KB
testcase_15 AC 2 ms
6,816 KB
testcase_16 AC 2 ms
6,816 KB
testcase_17 AC 1 ms
6,816 KB
testcase_18 AC 2 ms
6,816 KB
testcase_19 AC 2 ms
6,816 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

#include <atcoder/modint>

using namespace std;
using ll = long long;
using ld = long double;
using mint = atcoder::modint998244353;
using Pair = pair<int, int>;
using Tuple = tuple<int, int, int>;
using VI1 = vector<int>;
using VI2 = vector<VI1>;
using VL1 = vector<ll>;
using VL2 = vector<VL1>;
using VD1 = vector<ld>;
using VD2 = vector<VD1>;
using VB1 = vector<bool>;
using VB2 = vector<VB1>;
using VP1 = vector<Pair>;
using VP2 = vector<VP1>;
using VT1 = vector<Tuple>;
using VT2 = vector<VT1>;
using VM1 = vector<mint>;
using VM2 = vector<VM1>;
using Queue = queue<int>;
using DQ = deque<int>;
using PQ = priority_queue<int, vector<int>, greater<int>>;
using Table = VI2;
using Graph = VI2;

VM2 multiple(VM2 &M) {
  VM2 M2(2, VM1(2, 0));
  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j < 2; ++j) {
      for (int k = 0; k < 2; ++k) M2[i][j] += M[i][k] * M[k][j];
    }
  }
  return M2;
}

auto solve() {
  ll N;
  cin >> N;
  --N;
  VM1 dp{mint(1), mint(0)};
  VM2 M{{1, 1}, {1, 0}};
  for (int i = 0; N >> i > 0; ++i) {
    if (N >> i & 1) {
      auto x = M[0][0] * dp[0] + M[0][1] * dp[1];
      auto y = M[1][0] * dp[0] + M[1][1] * dp[1];
      dp[0] = x;
      dp[1] = y;
    }
    M = multiple(M);
  }
  return (dp[0] + dp[1] - 1).val();
}

int main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  auto result = solve();
  cout << result << endl;
}
0