結果

問題 No.503 配列コレクション
ユーザー Min_25
提出日時 2017-05-04 00:37:14
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 32 ms / 2,000 ms
コード長 857 bytes
コンパイル時間 376 ms
コンパイル使用メモリ 33,024 KB
実行使用メモリ 10,880 KB
最終ジャッジ日時 2024-09-14 07:11:44
合計ジャッジ時間 1,241 ms
ジャッジサーバーID
(参考情報)
judge6 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 25
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <cstdio>

using i64 = long long;

int main() {
  int N, K, D;
  while (~scanf("%d %d %d", &N, &K, &D)) {
    int times = (N - 1) / (K - 1);
    int rest = N - (K - 1) * times;
    if (D == 1) {
      printf("%d\n", rest);
    } else {
      static int pows[1000010], invs[1000010];
      const int mod = 1e9 + 7;
      pows[0] = 1;
      for (int i = 1; i <= times; ++i) {
        pows[i] = i64(pows[i - 1]) * D % mod;
      }
      invs[1] = 1;
      for (int i = 2; i <= times; ++i) {
        invs[i] = i64(invs[mod % i]) * (mod - mod / i) % mod;
      }
      int binom = 1;
      __int128_t ans = 0;
      for (int i = 0; i <= times; ++i) {
        ans += i64(pows[times - i]) * binom;
        binom = i64(binom) * (rest - 1 + i) % mod * invs[i + 1] % mod;
      }
      ans *= rest;
      printf("%d", int(ans % mod));
    }
  }
  return 0;
}
0