結果
問題 | No.1504 ヌメロニム |
ユーザー |
|
提出日時 | 2020-10-18 04:59:25 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 2,246 bytes |
コンパイル時間 | 1,144 ms |
コンパイル使用メモリ | 100,468 KB |
最終ジャッジ日時 | 2025-01-15 11:27:50 |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 5 WA * 29 RE * 27 |
ソースコード
#include <cmath>#include <cstdint>#include <complex>#include <iostream>#include <vector>#define FOR(i,k,n) for(int i = (k);i < (n);++i)#define REP(i,n) FOR(i,0,n)#define ALL(x) begin(x),end(x)using namespace std;using vecint = vector<int>;using ll = int64_t;using vecll = vector<ll>;using P = complex<double>;const double pi = acos(-1.0);vector<P> FFT(double theta, const vector<P> &a) {const int n = a.size();vector<P> ret = a;for (int m = n; m >= 2; m >>= 1, theta *= 2) {REP(i,m/2) {for (int j = i; j < n; j += m) {int k = j + m / 2;P x = ret[j] - ret[k];ret[j] += ret[k];ret[k] = exp(i * theta * P(0, 1)) * x;}}}for (int i = 0, j = 1; j < n - 1; j++) {for (int k = n >> 1; k > (i ^= k); k >>= 1) {;}if (j < i) swap(ret[i], ret[j]);}return ret;}vector<ll> convolution(const vector<ll> &lhs, const vector<ll> &rhs) {int n = 1, a = lhs.size(), b = rhs.size();while (n < max(a, b) * 2) n <<= 1;vector<P> temp1(n), temp2(n);REP(i,n/2) {if (i < a) temp1[i] = P(lhs[i], 0);if (i < b) temp2[i] = P(rhs[i], 0);}temp1 = FFT(2.0 * pi / n, temp1);temp2 = FFT(2.0 * pi / n, temp2);REP(i,n) temp1[i] *= temp2[i];temp1 = FFT(-2.0 * pi / n, temp1);vector<ll> ret(n);REP(i,n) ret[i] = temp1[i].real() / n + 0.5;return ret;}constexpr ll MOD = 998244353;constexpr ll MAX_F = 600000;// a^-1 mod pll inv(ll a,ll p){return ( a == 1 ? 1 : (1 - p*inv(p%a,a)) / a + p );}int main() {vecll fact(MAX_F+1), finv(MAX_F+1);fact[0] = 1;REP(i,MAX_F) {fact[i+1] = fact[i] * (i+1) % MOD;}finv[MAX_F] = inv(fact[MAX_F], MOD);REP(ri,MAX_F) {int i = MAX_F - ri;finv[i-1] = finv[i] * i % MOD;}auto comb = [&] (ll n, ll k) {return fact[n] * finv[k] % MOD * finv[n-k] % MOD;};ll n,k;cin>>n>>k;string s;cin>>s;vecll left_i(n, 0), right_n(n, 0);REP(i,n) {if (s[i] == 'i') {left_i[i] = 1;} else {right_n[n-1-i] = 1;}}auto poly = convolution(left_i, right_n);ll ans = 0;REP(i,n-k-1) {ll span = n-2-i;ans += poly[i] * comb(span,k) % MOD;ans %= MOD;}cout<<ans<<"\n";return 0;}