Submission #1211200

#TimeUsernameProblemLanguageResultExecution timeMemory
1211200yangbaichDstorv (FXCUP3_dstorv)C++20
0 / 100
1 ms1092 KiB
#include <bits/stdc++.h> using namespace std; const int mod = 1e9 + 7; const int N = 5005; int jc[N], inv[N]; int n, r, h, a, b, ps[N], m, dp[2][N][N], qzh[2][N][N], inp[N], qza[N]; char s[N]; inline int Pow(int a, int b) { int ret = 1; while (b) { if (b & 1) ret = 1ll * ret * a % mod; a = 1ll * a * a % mod; b >>= 1; } return ret; } int fpw[2][N], pw[2][N]; int main() { scanf("%d%d%d%s%d%d", &n, &r, &h, s + 1, &a, &b); jc[0] = inv[0] = 1; for (int i = 1;i <= n;i++) { jc[i] = 1ll * jc[i - 1] * i % mod; inv[i] = Pow(i, mod - 2); } pw[0][0] = pw[1][0] = fpw[0][0] = fpw[1][0] = 1; for (int i = 1;i <= n;i++) { pw[0][i] = 1ll * pw[0][i - 1] * h % mod * inv[r + h] % mod; pw[1][i] = 1ll * pw[1][i - 1] * r % mod * inv[r + h] % mod; fpw[0][i] = Pow(pw[0][i], mod - 2); fpw[1][i] = Pow(pw[1][i], mod - 2); } for (int i = n;i >= 1;i--) if (s[i] == 'R') { ps[++m] = i; inp[m] = i; } for (int i = 1;i <= n+1;i++) qza[i] = qza[i-1] + (s[i] == 'H'); ps[0] = n + 1; for (int i = 0;i <= N - 5;i++) qzh[0][0][i] = 1; // cout<<pw[1][1]<<"\n"; for (int i = 1;i <= m;i++) { int B = i & 1; int hz = n - m - qza[ps[i]]; // cout<<"HZ"<<hz<<"\n"; for (int j = 0;j <= i;j++) for (int k = 0;k <=hz;k++) { int ai = qza[ps[i - 1]] - qza[ps[i]]; // if(k!=hz){ dp[B][j][k] = 1ll * pw[1][1] * (k - ai < 0 ? pw[0][ai - k] : fpw[0][k - ai]) % mod * (qzh[B ^ 1][j][hz + k - ai-1] - (k - ai <= 0 ? 0 : qzh[B ^ 1][j][k - ai - 1])+mod) % mod; // cout << i << " " << j << " " << k << " ai="<<ai<<" " << 1ll * pw[1][1] * (k - ai < 0 ? pw[0][ai - k] : fpw[0][k - ai]) % mod << "\n"; // cout << hz + k - ai -1<< " " << k - ai - 1 << " "<<qzh[B ^ 1][j][hz + k - ai-1] <<"->"<< (qzh[B ^ 1][j][hz + k - ai] - (k - ai <= 0 ? 0 : qzh[B ^ 1][j][k - ai - 1])+mod) <<"\n"; // } if (!k && j) dp[B][j][k] = (dp[B][j][k] + 1ll*pw[0][ai]*qzh[B ^ 1][j - 1][n - m - qza[ps[i-1]]]%mod) % mod; qzh[B][j][k] = (qzh[B][j][k - 1] + 1ll * dp[i & 1][j][k] * pw[0][k] % mod) % mod; // cout<<i<<" "<<j<<" "<<k<<"="<<dp[B][j][k]<<"\n\n"; } } //cout<<(m&1)<<" "<<b<<" "<<a-qza[ps[m]]<<"\n"; if (a < qza[ps[m]]) cout << 0; else cout << dp[m & 1][b][a - qza[ps[m]]]; }

Compilation message (stderr)

dstorv.cpp: In function 'int main()':
dstorv.cpp:20:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |         scanf("%d%d%d%s%d%d", &n, &r, &h, s + 1, &a, &b);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...