結果
| 問題 | No.3538 Not First Place |
| コンテスト | |
| ユーザー |
tau1235
|
| 提出日時 | 2026-05-09 05:07:23 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 461 ms / 5,000 ms |
| コード長 | 848 bytes |
| 記録 | |
| コンパイル時間 | 2,356 ms |
| コンパイル使用メモリ | 336,680 KB |
| 実行使用メモリ | 81,664 KB |
| 最終ジャッジ日時 | 2026-05-09 05:07:32 |
| 合計ジャッジ時間 | 7,376 ms |
|
ジャッジサーバーID (参考情報) |
judge1_1 / judge2_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 26 |
ソースコード
#include<bits/stdc++.h>
#include<atcoder/modint>
using namespace std;
using mint=atcoder::modint998244353;
vector<mint> fact,ifact;
void factcalc(int n){
fact.assign(n+1,0);
ifact.assign(n+1,0);
fact[0]=1;ifact[0]=1;
for (int i=1;i<=n;i++) fact[i]=fact[i-1]*i;
ifact[n]=fact[n].inv();
for (int i=n-1;i>=0;i--) ifact[i]=ifact[i+1]*(i+1);
}
mint comb(int n,int k){
if (n<k||n<0||k<0) return 0;
return fact[n]*ifact[k]*ifact[n-k];
}
int main(){
factcalc(1e7);
int n,m,k,l;
cin>>n>>m>>k>>l;
int s=m*k;
auto f=[&](int a,int b){
mint ret=0;
for (int i=0;i<n;i++){
int j=i*(b+1);
if (s-a<j) continue;
mint p=comb(n-1,i)*comb((s-a-j)+(n-2),n-2);
if (i%2==0) ret+=p;
else ret-=p;
}
return ret;
};
mint ans=0;
for (int a=l;a<m;a++) ans+=f(a,m)-f(a,a);
cout<<ans.val()<<endl;
}
tau1235