結果
問題 | No.2876 Infection |
ユーザー |
👑 ![]() |
提出日時 | 2024-09-06 22:22:05 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 6,237 bytes |
コンパイル時間 | 3,481 ms |
コンパイル使用メモリ | 238,096 KB |
最終ジャッジ日時 | 2025-02-24 04:32:55 |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 24 RE * 3 |
ソースコード
#line 1 "a.cpp"#include <bits/stdc++.h>using namespace std;using std::cout;using std::cin;using std::endl;using ll=long long;using ld=long double;const ll ILL=2167167167167167167;const int INF=2100000000;#define rep(i,a,b) for (int i=(int)(a);i<(int)(b);i++)#define all(p) p.begin(),p.end()template<class T> using _pq = priority_queue<T, vector<T>, greater<T>>;template<class T> ll LB(vector<T> &v,T a){return lower_bound(v.begin(),v.end(),a)-v.begin();}template<class T> ll UB(vector<T> &v,T a){return upper_bound(v.begin(),v.end(),a)-v.begin();}template<class T> bool chmin(T &a,T b){if(a>b){a=b;return 1;}else return 0;}template<class T> bool chmax(T &a,T b){if(a<b){a=b;return 1;}else return 0;}template<class T> void So(vector<T> &v) {sort(v.begin(),v.end());}template<class T> void Sore(vector<T> &v) {sort(v.begin(),v.end(),[](T x,T y){return x>y;});}bool yneos(bool a,bool upp=0){if(a){cout<<(upp?"YES\n":"Yes\n");}else{cout<<(upp?"NO\n":"No\n");}return a;}template<class T> void vec_out(vector<T> &p,int ty=0){if(ty==2){cout<<'{';for(int i=0;i<(int)p.size();i++){if(i){cout<<",";}cout<<'"'<<p[i]<<'"';}cout<<"}\n";}else{if(ty==1){cout<<p.size()<<"\n";}for(int i=0;i<(int)(p.size());i++){if(i) cout<<" ";cout<<p[i];}cout<<"\n";}}template<class T> T vec_min(vector<T> &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmin(ans,x);return ans;}template<class T> T vec_max(vector<T> &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmax(ans,x);return ans;}template<class T> T vec_sum(vector<T> &a){T ans=T(0);for(auto &x:a) ans+=x;return ans;}int pop_count(long long a){int res=0;while(a){res+=(a&1),a>>=1;}return res;}template<class T> bool inside(T l,T x,T r){return l<=x&&x<r;}#include <atcoder/modint>using mint = atcoder::modint998244353;#line 2 "/Users/Shared/po167_library/fps/Taylor_Shift.hpp"#include <atcoder/convolution>#line 2 "/Users/Shared/po167_library/math/Binomial.hpp"#line 5 "/Users/Shared/po167_library/math/Binomial.hpp"namespace po167{template<class T>struct Binomial{std::vector<T> fact_vec, fact_inv_vec;void extend(int m = -1){int n = fact_vec.size();if (m == -1) m = n * 2;if (n >= m) return;fact_vec.resize(m);fact_inv_vec.resize(m);for (int i = n; i < m; i++){fact_vec[i] = fact_vec[i - 1] * T(i);}fact_inv_vec[m - 1] = T(1) / fact_vec[m - 1];for (int i = m - 1; i > n; i--){fact_inv_vec[i - 1] = fact_inv_vec[i] * T(i);}}Binomial(int MAX = 0){fact_vec.resize(1, T(1));fact_inv_vec.resize(1, T(1));extend(MAX + 1);}T fact(int i){if (i < 0) return 0;while (int(fact_vec.size()) <= i) extend();return fact_vec[i];}T invfact(int i){if (i < 0) return 0;while (int(fact_inv_vec.size()) <= i) extend();return fact_inv_vec[i];}T C(int a, int b){if (a < b || b < 0) return 0;return fact(a) * invfact(b) * invfact(a - b);}T invC(int a, int b){if (a < b || b < 0) return 0;return fact(b) * fact(a - b) *invfact(a);}T P(int a, int b){if (a < b || b < 0) return 0;return fact(a) * invfact(a - b);}T inv(int a){if (a < 0) return inv(-a) * T(-1);if (a == 0) return 1;return fact(a - 1) * invfact(a);}T Catalan(int n){if (n < 0) return 0;return fact(2 * n) * invfact(n + 1) * invfact(n);}T narayana(int n, int k){if (n <= 0 || n < k || k < 1) return 0;return C(n, k) * C(n, k - 1) * inv(n);}T Catalan_pow(int n,int d){if (n < 0 || d < 0) return 0;if (d == 0){if (n == 0) return 1;return 0;}return T(d) * inv(d + n) * C(2 * n + d - 1, n);}// retrun [x^a] 1/(1-x)^bT ruiseki(int a,int b){if (a < 0 || b < 0) return 0;if (a == 0){return 1;}return C(a + b - 1, b - 1);}// (a, b) -> (c, d)// always x + e >= yT mirror(int a, int b, int c, int d, int e = 0){if (a + e < b || c + e < d) return 0;if (a > c || b > d) return 0;a += e;c += e;return C(c + d - a - b, c - a) - C(c + d - a - b, c - b + 1);}// return sum_{i = 0, ... , a} sum_{j = 0, ... , b} C(i + j, i)// return C(a + b + 2, a + 1) - 1;T gird_sum(int a, int b){if (a < 0 || b < 0) return 0;return C(a + b + 2, a + 1) - 1;}// return sum_{i = a, ..., b - 1} sum_{j = c, ... , d - 1} C(i + j, i)// AGC 018 ET gird_sum_2(int a, int b, int c, int d){if (a >= b || c >= d) return 0;a--, b--, c--, d--;return gird_sum(a, c) - gird_sum(a, d) - gird_sum(b, c) + gird_sum(b, d);}};}#line 5 "/Users/Shared/po167_library/fps/Taylor_Shift.hpp"namespace po167{// return f(x + c)template<class T>std::vector<T> Taylor_Shift(std::vector<T> f, T c){int n = f.size();Binomial<T> table(n);std::vector<T> g(n);T tmp = 1;for (int i = 0; i < n; i++){g[n - 1 - i] = table.invfact(i) * tmp;tmp *= c;f[i] *= table.fact(i);}// using cyclic convolution is faster ?g = atcoder::convolution(f, g);std::vector<T> res(n);for (int i = 0; i < n; i++){res[i] = table.invfact(i) * g[n + i - 1];}return res;}}#line 32 "a.cpp"void solve();// CYAN / FREDERICint main() {ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1;// cin >> t;rep(i, 0, t) solve();}void solve(){int N, x;cin >> N >> x;mint p = (mint)(x) / (mint)(100);mint q = 1 - p;if (x == 0){cout << 1 << "\n";return;}if (x == 100){cout << N << "\n";}vector<mint> dp(N);mint ans = 0;dp[N - 1] = 1;for (int i = N - 1; i >= 0; i--){mint tmp = 1;for (auto &y : dp) y *= tmp, tmp *= q;dp = po167::Taylor_Shift(dp, p / q);ans += (mint)(N - i) * dp.back();dp.pop_back();}cout << ans.val() << "\n";}