結果
問題 | No.2951 Similar to Mex |
ユーザー |
|
提出日時 | 2025-01-07 10:20:51 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 9,598 bytes |
コンパイル時間 | 6,340 ms |
コンパイル使用メモリ | 352,132 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2025-01-07 10:21:05 |
合計ジャッジ時間 | 12,643 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 WA * 21 |
ソースコード
#ifndef ONLINE_JUDGE#define _GLIBCXX_DEBUG#endif#include "atcoder/all"#include <string>#include <bits/stdc++.h>#include <climits>/*Boostが使用したかったら WSLの方で開いて#include <boost/multiprecision/cpp_dec_float.hpp>#include <boost/multiprecision/cpp_int.hpp>#include <boost/rational.hpp>#include <boost/functional/hash.hpp>// 任意長整数型using Bint = boost::multiprecision::cpp_int;// 仮数部が10進数で1024桁の浮動小数点数型(TLEしたら小さくする)using BReal =boost::multiprecision::number<boost::multiprecision::cpp_dec_float<1024>>;using Rat = boost::rational<Bint>;*/#include <ext/pb_ds/assoc_container.hpp>#include <ext/pb_ds/tree_policy.hpp>using namespace std;using namespace __gnu_pbds;// 型エイリアスの設定template<typename T>using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;using namespace atcoder;template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }template<typename T> inline bool chmin(T &a, T b) { return ((a>b) ? (a = b, true) : (false));}#define rep(i,n) for(int i=0;i<(int)(n);i++)#define drep(i,n) for(int i=n-1;i>=0;i--)#define REP(i,s,n) for(int i=s;i<(int)n;i++)#define DREP(i,s,n) for(int i=n-1;i>=s;i--)const long long inf = 1LL<<60;const int infi = 1e9+1;typedef long long ll;typedef long double ld;typedef __int128_t l3;//cmpArg := 偏角ソート, atan2l(y, x); atan2l(y, x) = [-pi, pi]#define cmpArg [](const auto &p1, const auto &p2) { return atan2l(p1.second, p1.first) < atan2l(p2.second, p2.first); }typedef pair<int,int> pi;typedef pair<ll,ll> pl;#define vl vector<ll>#define vvl vector<vector<ll>>#define vi vector<int>#define vvi vector<vector<int>>#define vm vector<mint>#define vvm vector<vector<mint>>#define vvc vector<vector<char>>#define vc vector<char>#define vvpi vector<vector<pi>>#define vpi vector<pi>#define vpl vector<pl>#define vvpl vector<vector<pl>>#define pb push_back#define eb emplace_back#define YES cout<<"Yes"<<endl;#define NO cout<<"No"<<endl;#define YN { cout << "Yes" << endl; } else { cout << "No" << endl; }#define all(x) x.begin(), x.end()#define rall(i) std::rbegin(i), std::rend(i)#define len(x) ((ll)(x).size())#define fi first#define se second#define UNIQUE(x) sort(all(x)), x.erase(unique(all(x)), x.end())int pc(ll x) { return __builtin_popcount(x); } //ビット列にどれだけ1がたっているかを求める pop countvoid cincout(){ ios::sync_with_stdio(false); std::cin.tie(nullptr); cout<< fixed << setprecision(15); }bool out_grid(ll i, ll j, ll h, ll w) { return (!(0<=i && i<h && 0<=j && j<w)); }inline void read(int &a) { std::cin >> a; }inline void read(unsigned &a) { std::cin >> a; }inline void read(long &a) { std::cin >> a; }inline void read(long long &a) { std::cin >> a; }inline void read(unsigned long long &a) { std::cin >> a; }inline void read(char &a) { std::cin >> a; }inline void read(float &a) { std::cin >> a; }inline void read(double &a) { std::cin >> a; }inline void read(long double &a) { std::cin >> a; }inline void read(std::vector<bool> &vec) {for (int32_t i = 0; i < vec.size(); i++) {int a;read(a);vec[i] = a;}}inline void read(std::string &a) { std::cin >> a; }template <class T>inline void read(std::vector<T> &vec);template <class T, size_t size>inline void read(std::array<T, size> &vec);template <class T, class L>inline void read(std::pair<T, L> &p);template <class T, size_t size>inline void read(T (&vec)[size]);template <class T>inline void read(std::vector<T> &vec) {for (auto &i : vec) read(i);}template <class T>inline void read(std::deque<T> &vec) {for (auto &i : vec) read(i);}template <class T, size_t size>inline void read(std::array<T, size> &vec) {for (auto &i : vec) read(i);}template <class T, class L>inline void read(std::pair<T, L> &p) {read(p.first);read(p.second);}template <class T, size_t size>inline void read(T (&vec)[size]) {for (auto &i : vec) read(i);}template <class T>inline void read(T &a) {std::cin >> a;}inline void in() {}template <class Head, class... Tail>inline void in(Head &head, Tail &...tail) {read(head);in(tail...);}inline void print() { std::cout << ' '; }inline void print(const bool &a) { std::cout << a; }inline void print(const int &a) { std::cout << a; }inline void print(const unsigned &a) { std::cout << a; }inline void print(const long &a) { std::cout << a; }inline void print(const long long &a) { std::cout << a; }inline void print(const unsigned long long &a) { std::cout << a; }inline void print(const char &a) { std::cout << a; }inline void print(const char a[]) { std::cout << a; }inline void print(const float &a) { std::cout << a; }inline void print(const double &a) { std::cout << a; }inline void print(const long double &a) { std::cout << a; }inline void print(const std::string &a) {for (auto &&i : a) print(i);}template <class T>inline void print(const std::vector<T> &vec);template <class T, size_t size>inline void print(const std::array<T, size> &vec);template <class T, class L>inline void print(const std::pair<T, L> &p);template <class T, size_t size>inline void print(const T (&vec)[size]);template <class T>inline void print(const std::vector<T> &vec) {if (vec.empty()) return;print(vec[0]);for (auto i = vec.begin(); ++i != vec.end();) {std::cout << ' ';print(*i);}}template <class T>inline void print(const std::deque<T> &vec) {if (vec.empty()) return;print(vec[0]);for (auto i = vec.begin(); ++i != vec.end();) {std::cout << ' ';print(*i);}}template <class T, size_t size>inline void print(const std::array<T, size> &vec) {print(vec[0]);for (auto i = vec.begin(); ++i != vec.end();) {std::cout << ' ';print(*i);}}template <class T, class L>inline void print(const std::pair<T, L> &p) {print(p.first);std::cout << ' ';print(p.second);}template <class T, size_t size>inline void print(const T (&vec)[size]) {print(vec[0]);for (auto i = vec; ++i != end(vec);) {std::cout << ' ';print(*i);}}template <class T>inline void print(const T &a) {std::cout << a;}inline void out() { std::cout << '\n'; }template <class T>inline void out(const T &t) {print(t);std::cout << '\n';}template <class Head, class... Tail>inline void out(const Head &head, const Tail &...tail) {print(head);std::cout << ' ';out(tail...);}#define vec(type, name, ...) vector<type> name(__VA_ARGS__);#define vv(type, name, h, ...) std::vector<std::vector<type>> name(h, std::vector<type>(__VA_ARGS__));#define INT(...) int32_t __VA_ARGS__; in(__VA_ARGS__)#define LL(...) int64_t __VA_ARGS__; in(__VA_ARGS__)#define ULL(...) uint64_t __VA_ARGS__; in(__VA_ARGS__)#define STR(...) std::string __VA_ARGS__; in(__VA_ARGS__)#define CHR(...) char __VA_ARGS__; in(__VA_ARGS__)#define LD(...) long double __VA_ARGS__; in(__VA_ARGS__)#define VEC(type, name, size) std::vector<type> name(size); in(name)#define VV(type, name, h, w) std::vector<std::vector<type>> name(h, std::vector<type>(w)); in(name)template <class T>ll sum(const T &a) {return accumulate(std::begin(a), std::end(a), 0LL);}template <class T>ld dsum(const T &a) {return accumulate(std::begin(a), std::end(a), 0.0L);}template <class T>auto min(const T &a) {return *min_element(std::begin(a), std::end(a));}template <class T>auto max(const T &a) {return *max_element(std::begin(a), std::end(a));}template<typename T> T floor_div(const T n, const T d) {assert(d != 0);return n / d - static_cast<T>((n ^ d) < 0 && n % d != 0);}template<typename T> T ceil_div(const T n, const T d) {assert(d != 0);return n / d + static_cast<T>((n ^ d) >= 0 && n % d != 0);}using mint = modint998244353;const ll MAX = 101010;const ll MOD = 998244353;long long fac[MAX], finv[MAX], inv[MAX];// テーブルを作る前処理void COMinit() {fac[0] = fac[1] = 1; //累積積finv[0] = finv[1] = 1; //逆元の累積積inv[1] = 1; //逆元for (int i = 2; i < MAX; i++){fac[i] = fac[i - 1] * i % MOD;inv[i] = MOD - inv[MOD%i] * (MOD / i) % MOD;finv[i] = finv[i - 1] * inv[i] % MOD;}}// 二項係数計算long long COM(ll n, ll k){if (n < k) return 0;if (n < 0 || k < 0) return 0;return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;}long long PER(ll n, ll k) {if(n < k) return 0;if(n < 0 || k < 0) return 0;return (fac[n] * finv[n-k]) % MOD;}mint fastpow(mint a, int b) {mint res = 1;while(b) {if(b&1) res *= a;a *= a;b >>= 1;}return res;}int main(){COMinit();INT(N,M,K);int ma = min(K+N, M+1); //mexの上界vvm dp(ma+1,vm(ma+1));dp[0][0] = 1;rep(now,ma+1) rep(j,ma) REP(nxt,now+1,ma+1) {int pw = min(K-now, nxt-now); pw = max(0,pw);dp[nxt][j+1] += dp[now][j] * fastpow(nxt, pw);}//dp[ma][*]が有効 *-1だけ取らないmint ans = 0;REP(cnt,1,ma+1) {int get = M - (cnt-1); //getこは必ず取っているif(get <= 0) continue;if(get > N) continue;mint sum = 0;for(int i=0,sign=1;i<=get;i++, sign*=-1) sum += fastpow(get-i,N) * COM(get,i) * sign;ans += dp[ma][cnt] * sum;}out(ans.val());}