标签:信息学 const int inv 1ll return 计蒜客 stack 998244353
C.stack
本问题是使用栈跳出开头是1的操作序列方案数
考虑⼀个合法的输出时如何产生的,因为开头必须为1,先指定开头的元素,将这个元素前面的元素都先放⼊栈中。
把问题转化成一个栈中已经存在一定元素求出栈序列个数。假设这个元素为第i个,那么1~i-1在栈中,1+i~n在队列中。就是转化为经典的卡特兰数:
答案为
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e6 + 10; 4 const int mod = 998244353; 5 int n, f[maxn]; 6 int fac[maxn<<1],inv[maxn<<1]; 7 int qmi(int a, int b, int m) { 8 a %= m; 9 if (!a)return 0; 10 int result = 1; 11 for (; b; a = 1ll * a * a % m, b >>= 1) 12 if (b& 1)result = 1ll * result * a % m; 13 return result; 14 } 15 int C(const int n, const int m) { 16 if (n < m)return 0; 17 return 1ll * fac[n] * inv[m] % 998244353 * inv[n - m] % 998244353; 18 } 19 int cal(int a, int b) { 20 return(1ll * C(a + 2 * b, b) - C(a + 2 * b, b - 1) + 998244353) % 998244353; 21 } 22 void init(const int n) { 23 fac[0] = 1; 24 for (int i = 1; i <= n; i++)fac[i]=1ll*fac[i-1]*i%998244353; 25 inv[n] = qmi(fac[n], 998244353 - 2, 998244353); 26 for (int i = n - 1; i >= 0; i--) 27 inv[i] = inv[i + 1] * (i + 1ll) % 998244353; 28 } 29 int main() { 30 freopen("stack.in", "r", stdin); 31 freopen("stack.out", "w", stdout); 32 scanf("%d", &n); 33 init(n << 1); 34 for (int i = 1; i <= n; i++)scanf("%d", &f[i]); 35 int ans = 0; 36 for (int i = 1; i <= n; i++) 37 if (f[i])ans=(ans+cal(i-1,n-i))%998244353; 38 cout<<ans<<endl; 39 return 0; 40 }
标签:信息学,const,int,inv,1ll,return,计蒜客,stack,998244353 来源: https://www.cnblogs.com/nancychai/p/16608347.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。