結果
| 問題 |
No.1856 Mex Sum 2
|
| コンテスト | |
| ユーザー |
蜜蜂
|
| 提出日時 | 2022-02-23 10:10:23 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,005 ms / 3,000 ms |
| コード長 | 1,728 bytes |
| コンパイル時間 | 4,280 ms |
| コンパイル使用メモリ | 239,964 KB |
| 実行使用メモリ | 19,336 KB |
| 最終ジャッジ日時 | 2024-07-01 10:28:25 |
| 合計ジャッジ時間 | 31,823 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 64 |
ソースコード
//g++ 3.cpp -std=c++14 -O2 -I .
#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
using ll = long long;
using ld = long double;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vld = vector<ld>;
using vvld = vector<vld>;
using vst = vector<string>;
using vvst = vector<vst>;
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define pq_big(T) priority_queue<T,vector<T>,less<T>>
#define pq_small(T) priority_queue<T,vector<T>,greater<T>>
#define all(a) a.begin(),a.end()
#define rep(i,start,end) for(ll i=start;i<(ll)(end);i++)
#define per(i,start,end) for(ll i=start;i>=(ll)(end);i--)
#define uniq(a) sort(all(a));a.erase(unique(all(a)),a.end())
using mint = modint998244353;
constexpr ll mod = 998244353;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll n,m;
cin>>n>>m;
ll mx=min(n,m+1);
mint pw[mx+1][n+1]={}; // pw[i][j] := (M+1-i)^(N-k)
rep(i,0,mx+1){
pw[i][n]=1;
per(j,n-1,0){
pw[i][j]=pw[i][j+1]*(m+1-i);
}
}
mint pw2[n+1]={}; // pw2[i] := 2^i
pw2[0]=1;
rep(i,1,n+1){
pw2[i]=pw2[i-1]*2;
}
mint fac[n+1]={}; // fac[i] := i!
fac[0]=1;
rep(i,1,n+1){
fac[i]=fac[i-1]*i;
}
vll fp(n+1,0);
rep(i,1,n+1){
mint now=pw2[i]-1;
now/=(pw2[i]*fac[i]);
fp[i]=now.val();
}
mint ans=0;
vll fp_now={1};
rep(i,1,mx+1){
fp_now=convolution(fp_now,fp);
rep(j,0,n+1){
mint now=1;
now/=fac[n-j];
now*=pw[i][j];
now*=fp_now[j];
ans+=now;
}
while(fp_now.size()>n+5){
fp_now.pop_back();
}
}
ans*=pw2[n];
ans*=fac[n];
cout<<ans.val()<<endl;
}
蜜蜂