ログインしてください。
提出 #64378233
ソースコード 拡げる
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=(a);i<(n);i++)
#define per(i,a,n) for (int i=(n)-1;i>=(a);i--)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef basic_string<int> BI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(random_device{}());
const ll mod=998244353;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head
template<int MOD, int RT> struct mint {
static const int mod = MOD;
static constexpr mint rt() { return RT; } // primitive root for FFT
int v; explicit operator int() const { return v; } // explicit -> don't silently convert to int
mint():v(0) {}
mint(ll _v) { v = int((-MOD < _v && _v < MOD) ? _v : _v % MOD);
if (v < 0) v += MOD; }
bool operator==(const mint& o) const {
return v == o.v; }
friend bool operator!=(const mint& a, const mint& b) {
return !(a == b); }
friend bool operator<(const mint& a, const mint& b) {
return a.v < b.v; }
mint& operator+=(const mint& o) {
if ((v += o.v) >= MOD) v -= MOD;
return *this; }
mint& operator-=(const mint& o) {
if ((v -= o.v) < 0) v += MOD;
return *this; }
mint& operator*=(const mint& o) {
v = int((ll)v*o.v%MOD); return *this; }
mint& operator/=(const mint& o) { return (*this) *= inv(o); }
friend mint pow(mint a, ll p) {
mint ans = 1; assert(p >= 0);
for (; p; p /= 2, a *= a) if (p&1) ans *= a;
return ans; }
friend mint inv(const mint& a) { assert(a.v != 0);
return pow(a,MOD-2); }
mint operator-() const { return mint(-v); }
mint& operator++() { return *this += 1; }
mint& operator--() { return *this -= 1; }
friend mint operator+(mint a, const mint& b) { return a += b; }
friend mint operator-(mint a, const mint& b) { return a -= b; }
friend mint operator*(mint a, const mint& b) { return a *= b; }
friend mint operator/(mint a, const mint& b) { return a /= b; }
};
const int MOD=998244353;
using mi = mint<MOD,5>; // 5 is primitive root for both common mods
namespace simp {
vector<mi> fac,ifac,invn;
void check(int x) {
assert(mod==MOD);
if (fac.empty()) {
fac={mi(1),mi(1)};
ifac={mi(1),mi(1)};
invn={mi(0),mi(1)};
}
while (SZ(fac)<=x) {
int n=SZ(fac),m=SZ(fac)*2;
fac.resize(m);
ifac.resize(m);
invn.resize(m);
for (int i=n;i<m;i++) {
fac[i]=fac[i-1]*mi(i);
invn[i]=mi(MOD-MOD/i)*invn[MOD%i];
ifac[i]=ifac[i-1]*invn[i];
}
}
}
mi gfac(int x) {
assert(x>=0);
check(x); return fac[x];
}
mi ginv(int x) {
assert(x>0);
check(x); return invn[x];
}
mi gifac(int x) {
assert(x>=0);
check(x); return ifac[x];
}
mi binom(int n,int m) {
if (m < 0 || m > n) return mi(0);
return gfac(n)*gifac(m)*gifac(n - m);
}
mi binombf(int n,int m) {
if (m < 0 || m > n) return mi(0);
if (m>n-m) m=n-m;
mi p=1,q=1;
for (int i=1;i<=m;i++) p=p*(n+1-i),q=q*i;
return p/q;
}
}
const int N=501000;
int n,k;
int lev[N],mat;
char s[N];
mi ans;
int main() {
scanf("%d%d",&n,&k);
scanf("%s",s);
if (n==k) {
puts("1");
return 0;
}
rep(i,0,k) lev[i+1]=lev[i]+(s[i]=='('?1:-1);
int mat=0;
rep(i,1,k+1) mat+=lev[i]==0;
if (mat==k/2) {
mi pw=1;
for (int i=n;i>=k;i--) {
ans+=simp::binom(i-1,k-1)*pw;
pw=pw*2;
}
} else {
// 0... mat+1 可以加 )) ((
int pg=0;
rep(i,0,n) if (s[i]!="()"[i%2]) {
pg=i/2;
break;
}
ans=(simp::binom(n-k-1+2*(pg+1)+mat-pg,n-k-1))*(mat-pg);
ans+=simp::binom(n-k+2*(pg+1)+mat-pg-1,n-k);
}
printf("%d\n",(int)ans);
}
提出情報
| 提出日時 | |
|---|---|
| 問題 | B - Maximum Bracket Subsequence |
| ユーザ | apiad |
| 言語 | C++ 20 (gcc 12.2) |
| 得点 | 900 |
| コード長 | 3903 Byte |
| 結果 | AC |
| 実行時間 | 640 ms |
| メモリ | 235376 KiB |
コンパイルエラー
Main.cpp: In function ‘int main()’:
Main.cpp:120:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
120 | scanf("%d%d",&n,&k);
| ~~~~~^~~~~~~~~~~~~~
Main.cpp:121:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
121 | scanf("%s",s);
| ~~~~~^~~~~~~~
ジャッジ結果
| セット名 | Sample | All | ||||
|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 900 / 900 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| Sample | 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 00_sample_04.txt |
| All | 00_sample_01.txt, 00_sample_02.txt, 00_sample_03.txt, 00_sample_04.txt, 01_random_case_01.txt, 01_random_case_02.txt, 01_random_case_03.txt, 01_random_case_04.txt, 01_random_case_05.txt, 01_random_case_06.txt, 01_random_case_07.txt, 01_random_case_08.txt, 01_random_case_09.txt, 01_random_case_10.txt, 01_random_case_11.txt, 01_random_case_12.txt, 01_random_case_13.txt, 01_random_case_14.txt, 01_random_case_15.txt, 01_random_case_16.txt, 02_simple_case_01.txt, 02_simple_case_02.txt, 02_simple_case_03.txt, 02_simple_case_04.txt, 02_simple_case_05.txt, 02_simple_case_06.txt, 02_simple_case_07.txt, 02_simple_case_08.txt, 02_simple_case_09.txt, 02_simple_case_10.txt, 02_simple_case_11.txt, 02_simple_case_12.txt, 03_max_case_01.txt, 03_max_case_02.txt, 03_max_case_03.txt, 03_max_case_04.txt, 03_max_case_05.txt, 03_max_case_06.txt, 03_max_case_07.txt, 03_max_case_08.txt, 03_max_case_09.txt, 03_max_case_10.txt, 03_max_case_11.txt, 03_max_case_12.txt, 03_max_case_13.txt, 03_max_case_14.txt, 03_max_case_15.txt, 03_max_case_16.txt, 03_max_case_17.txt, 03_max_case_18.txt, 03_max_case_19.txt, 03_max_case_20.txt, 04_corner_01.txt, 04_corner_02.txt, 04_corner_03.txt, 04_corner_04.txt, 04_corner_05.txt, 04_corner_06.txt, 05_handmade_01.txt, 05_handmade_02.txt, 05_handmade_03.txt, 05_handmade_04.txt, 05_handmade_05.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| 00_sample_01.txt | AC | 1 ms | 3704 KiB |
| 00_sample_02.txt | AC | 1 ms | 3680 KiB |
| 00_sample_03.txt | AC | 1 ms | 3632 KiB |
| 00_sample_04.txt | AC | 547 ms | 232840 KiB |
| 01_random_case_01.txt | AC | 108 ms | 61888 KiB |
| 01_random_case_02.txt | AC | 109 ms | 63396 KiB |
| 01_random_case_03.txt | AC | 101 ms | 62124 KiB |
| 01_random_case_04.txt | AC | 104 ms | 63348 KiB |
| 01_random_case_05.txt | AC | 256 ms | 119796 KiB |
| 01_random_case_06.txt | AC | 112 ms | 63288 KiB |
| 01_random_case_07.txt | AC | 47 ms | 33820 KiB |
| 01_random_case_08.txt | AC | 535 ms | 235296 KiB |
| 01_random_case_09.txt | AC | 49 ms | 34116 KiB |
| 01_random_case_10.txt | AC | 50 ms | 34676 KiB |
| 01_random_case_11.txt | AC | 107 ms | 62672 KiB |
| 01_random_case_12.txt | AC | 114 ms | 63336 KiB |
| 01_random_case_13.txt | AC | 261 ms | 120160 KiB |
| 01_random_case_14.txt | AC | 252 ms | 120612 KiB |
| 01_random_case_15.txt | AC | 48 ms | 34172 KiB |
| 01_random_case_16.txt | AC | 243 ms | 120720 KiB |
| 02_simple_case_01.txt | AC | 111 ms | 62448 KiB |
| 02_simple_case_02.txt | AC | 105 ms | 62652 KiB |
| 02_simple_case_03.txt | AC | 244 ms | 120244 KiB |
| 02_simple_case_04.txt | AC | 104 ms | 63368 KiB |
| 02_simple_case_05.txt | AC | 249 ms | 120628 KiB |
| 02_simple_case_06.txt | AC | 112 ms | 63392 KiB |
| 02_simple_case_07.txt | AC | 238 ms | 120648 KiB |
| 02_simple_case_08.txt | AC | 535 ms | 235304 KiB |
| 02_simple_case_09.txt | AC | 254 ms | 120668 KiB |
| 02_simple_case_10.txt | AC | 254 ms | 120556 KiB |
| 02_simple_case_11.txt | AC | 262 ms | 120624 KiB |
| 02_simple_case_12.txt | AC | 247 ms | 120648 KiB |
| 03_max_case_01.txt | AC | 543 ms | 235100 KiB |
| 03_max_case_02.txt | AC | 529 ms | 235220 KiB |
| 03_max_case_03.txt | AC | 521 ms | 235352 KiB |
| 03_max_case_04.txt | AC | 526 ms | 235300 KiB |
| 03_max_case_05.txt | AC | 535 ms | 235292 KiB |
| 03_max_case_06.txt | AC | 523 ms | 235308 KiB |
| 03_max_case_07.txt | AC | 530 ms | 235272 KiB |
| 03_max_case_08.txt | AC | 539 ms | 235264 KiB |
| 03_max_case_09.txt | AC | 528 ms | 235372 KiB |
| 03_max_case_10.txt | AC | 528 ms | 235352 KiB |
| 03_max_case_11.txt | AC | 538 ms | 235304 KiB |
| 03_max_case_12.txt | AC | 547 ms | 235332 KiB |
| 03_max_case_13.txt | AC | 519 ms | 235328 KiB |
| 03_max_case_14.txt | AC | 530 ms | 235268 KiB |
| 03_max_case_15.txt | AC | 525 ms | 235304 KiB |
| 03_max_case_16.txt | AC | 519 ms | 235272 KiB |
| 03_max_case_17.txt | AC | 528 ms | 235148 KiB |
| 03_max_case_18.txt | AC | 522 ms | 235304 KiB |
| 03_max_case_19.txt | AC | 526 ms | 235376 KiB |
| 03_max_case_20.txt | AC | 553 ms | 235236 KiB |
| 04_corner_01.txt | AC | 636 ms | 234016 KiB |
| 04_corner_02.txt | AC | 640 ms | 233220 KiB |
| 04_corner_03.txt | AC | 143 ms | 62952 KiB |
| 04_corner_04.txt | AC | 638 ms | 234928 KiB |
| 04_corner_05.txt | AC | 134 ms | 61776 KiB |
| 04_corner_06.txt | AC | 59 ms | 33292 KiB |
| 05_handmade_01.txt | AC | 1 ms | 3768 KiB |
| 05_handmade_02.txt | AC | 1 ms | 3592 KiB |
| 05_handmade_03.txt | AC | 519 ms | 232780 KiB |
| 05_handmade_04.txt | AC | 639 ms | 235276 KiB |
| 05_handmade_05.txt | AC | 533 ms | 235288 KiB |