結果
| 問題 | No.3391 Line up Dominoes |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-02-23 19:44:59 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 257 ms / 3,000 ms |
| コード長 | 2,168 bytes |
| 記録 | |
| コンパイル時間 | 4,119 ms |
| コンパイル使用メモリ | 342,624 KB |
| 実行使用メモリ | 7,844 KB |
| 最終ジャッジ日時 | 2026-02-23 19:45:11 |
| 合計ジャッジ時間 | 11,008 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct mint{
inline static int64_t mod=998244353;
mint():val(0){}mint(const int64_t&v){val=v%mod;if(val<0)val+=mod;}
mint&operator+=(const mint&rhs){val+=rhs.val;if(val>=mod)val-=mod;return *this;}
mint&operator-=(const mint&rhs){val-=rhs.val;if(val<0)val+=mod;return *this;}
mint&operator*=(const mint&rhs){val=val*rhs.val%mod;return *this;}
mint&operator/=(const mint&rhs){return *this*=rhs.inv();}
mint pow(int64_t n)const{assert(0<=n);mint x=*this,r=1;while(n){if(n&1)r*=x;x*=x;n>>=1;}return r;}
mint inv(void)const{assert(val);return pow(mod-2);}mint operator-(void){return mint()-*this;}
friend mint operator+(const mint&lhs,const mint&rhs){return mint(lhs)+=rhs;}
friend mint operator-(const mint&lhs,const mint&rhs){return mint(lhs)-=rhs;}
friend mint operator*(const mint&lhs,const mint&rhs){return mint(lhs)*=rhs;}
friend mint operator/(const mint&lhs,const mint&rhs){return mint(lhs)/=rhs;}
friend bool operator==(const mint&lhs,const mint&rhs){return lhs.val==rhs.val;}
friend bool operator!=(const mint&lhs,const mint&rhs){return lhs.val!=rhs.val;}
friend bool operator<(const mint&lhs,const mint&rhs) {return lhs.val<rhs.val;}
friend std::istream&operator>>(std::istream& is,mint&v){int64_t x;is>>x;v.val=x%mod;return is;}
friend std::ostream&operator<<(std::ostream& os,const mint&v){return os<<v.val;}
private:int64_t val;
};
int main(void) {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int N, M, K;
cin >> N >> M >> K;
vector<int> A(N);
for(int i = 0; i < N; ++i) cin >> A[i];
sort(A.begin(), A.end());
vector<int> l(N), r(N);
for(int i = 0; i < N; ++i) {
l[i] = lower_bound(A.begin(), A.end(), A[i] - K) - A.begin();
r[i] = upper_bound(A.begin(), A.end(), A[i] + K) - A.begin();
}
vector<mint> dp(N, 1);
for(int _ = 2; _ <= M; ++_) {
vector<mint> dpsum(N + 1, 0);
for(int i = 0; i < N; ++i) dpsum[i + 1] = dpsum[i] + dp[i];
for(int i = 0; i < N; ++i) dp[i] = dpsum[r[i]] - dpsum[l[i]];
}
mint ans = 0;
for(int i = 0; i < N; ++i) ans += dp[i];
cout << ans << "\n";
return 0;
}