結果
| 問題 | No.3538 Not First Place |
| コンテスト | |
| ユーザー |
nauclhlt
|
| 提出日時 | 2026-02-28 15:02:58 |
| 言語 | C++17 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 1,039 ms / 5,000 ms |
| コード長 | 6,374 bytes |
| 記録 | |
| コンパイル時間 | 1,438 ms |
| コンパイル使用メモリ | 216,008 KB |
| 実行使用メモリ | 214,400 KB |
| 最終ジャッジ日時 | 2026-05-08 20:50:21 |
| 合計ジャッジ時間 | 6,929 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge3_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 26 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define CONST_MOD 998244353L
// #define CONST_MOD 1000000007L
struct ModInt
{
long long Value;
public:
ModInt()
{
Value = 0L;
}
ModInt(long long value)
{
Value = value;
}
ModInt Power(long long exp) const
{
if (exp <= -1L)
{
return ModInt(1L) / Power(-exp);
}
if (exp == 0L)
return 1L;
if (exp == 1L)
return *this;
ModInt m = Power(exp / 2L);
m = m * m;
if (exp % 2L == 1L)
{
m = m * (*this);
}
return m;
}
ModInt Inv() const
{
return this->Power(CONST_MOD - 2L);
}
ModInt operator+() const
{
return *this;
}
ModInt operator-() const
{
return ModInt(-Value);
}
friend ModInt operator+(const ModInt& left, const ModInt& right)
{
return ModInt(SafeMod(left.Value + right.Value));
}
friend ModInt operator+(const ModInt& left, const long long& right)
{
return ModInt(SafeMod(left.Value + right));
}
friend ModInt operator+(const long long& left, const ModInt& right)
{
return ModInt(SafeMod(left + right.Value));
}
ModInt& operator+=(const ModInt& x)
{
Value += x.Value;
Value = SafeMod(Value);
return *this;
}
ModInt& operator+=(const long long& x)
{
Value += x;
Value = SafeMod(Value);
return *this;
}
friend ModInt operator-(const ModInt& left, const ModInt& right)
{
return ModInt(SafeMod(left.Value - right.Value));
}
friend ModInt operator-(const ModInt& left, const long long& right)
{
return ModInt(SafeMod(left.Value - right));
}
friend ModInt operator-(const long long& left, const ModInt& right)
{
return ModInt(SafeMod(left - right.Value));
}
ModInt& operator-=(const ModInt& x)
{
Value -= x.Value;
Value = SafeMod(Value);
return *this;
}
ModInt& operator-=(const long long& x)
{
Value -= x;
Value = SafeMod(Value);
return *this;
}
friend ModInt operator*(const ModInt& left, const ModInt& right)
{
return ModInt(SafeMod(left.Value * right.Value));
}
friend ModInt operator*(const ModInt& left, const long long& right)
{
return ModInt(SafeMod(left.Value * right));
}
friend ModInt operator*(const long long& left, const ModInt& right)
{
return ModInt(SafeMod(left * right.Value));
}
ModInt& operator*=(const ModInt& x)
{
Value *= x.Value;
Value = SafeMod(Value);
return *this;
}
ModInt& operator*=(const long long& x)
{
Value *= x;
Value = SafeMod(Value);
return *this;
}
friend ModInt operator /(const ModInt& left, const ModInt& right)
{
ModInt inv = right.Inv();
return ModInt(SafeMod(left.Value * inv.Value));
}
friend ModInt operator/(const ModInt& left, const long long& right)
{
return ModInt(SafeMod(left.Value * ModInt(right).Inv().Value));
}
friend ModInt operator/(const long long& left, const ModInt& right)
{
return ModInt(SafeMod(left * right.Inv().Value));
}
ModInt& operator/=(const ModInt& x)
{
Value *= x.Inv().Value;
Value = SafeMod(Value);
return *this;
}
ModInt& operator/=(const long long& x)
{
Value *= ModInt(x).Inv().Value;
Value = SafeMod(Value);
return *this;
}
ModInt& operator++()
{
++Value;
Value = SafeMod(Value);
return *this;
}
ModInt operator++(int)
{
ModInt temp = *this;
Value++;
Value = SafeMod(Value);
return temp;
}
ModInt& operator--()
{
--Value;
Value = SafeMod(Value);
return *this;
}
ModInt operator--(int)
{
ModInt temp = *this;
Value--;
Value = SafeMod(Value);
return temp;
}
inline static ModInt One()
{
return ModInt(1L);
}
static ModInt Combination(long long n, long long r)
{
ModInt c = 1L;
for (ModInt i = 1; i.Value <= r; i++)
{
c = c * (ModInt(n) - i + ModInt::One()) / i;
}
return c;
}
private:
inline static long long SafeMod(long long a)
{
a %= CONST_MOD;
if (a < 0)
{
a += CONST_MOD;
}
return a;
}
};
class ModCache
{
private:
vector<ModInt> _factorial;
vector<ModInt> _inverseFactorial;
vector<ModInt> _inverse;
public:
ModCache(int max)
{
_factorial.resize(max + 1);
_inverseFactorial.resize(max + 1);
_inverse.resize(max + 1);
_factorial[0] = 1;
_inverseFactorial[0] = 1LL;
_inverse[1] = 1LL;
for (long p = 1; p <= max; p++)
{
_factorial[p] = _factorial[p - 1] * p;
if (p > 1)
{
_inverse[p] = -(CONST_MOD / p) * _inverse[CONST_MOD % p];
}
_inverseFactorial[p] = _inverseFactorial[p - 1] * _inverse[p];
}
}
ModInt Combination(int n, int r)
{
if (n < 0 || r < 0 || n < r) return 0;
return _factorial[n] * (_inverseFactorial[n - r] * _inverseFactorial[r]);
}
ModInt Permutation(int n, int r)
{
return _factorial[n] * _inverseFactorial[n - r];
}
ModInt Factorial(int n)
{
return _factorial[n];
}
ModInt Inverse(int n)
{
return _inverse[n];
}
};
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M, K, L;
cin >> N >> M >> K >> L;
ModCache cache(N + M * K);
ModInt ans = 0LL;
for (int x = L; x <= M; x++)
{
ll min1 = 1;
for (int i = 0; i <= N - 1; i++)
{
ans += min1 * cache.Combination(N - 1, i) * (
cache.Combination(N - 2 + M * K - x - (M + 1) * i, N - 2)
- cache.Combination(N - 2 + M * K - x - (x + 1) * i, N - 2)
);
min1 *= -1;
}
}
cout << ans.Value << endl;
}
nauclhlt