题意:给定一个长度为 n 的序列,求有多少个子序列满足该子序列内任意相邻 3 个数的和为偶数。

只与奇偶有关,所以可以把状态转化为 01 的。

设 \(f[i][x][y]\) 表示在前 i 个数中,最后一位为 x,倒数第二位为 y 的方案数。

\[f[i][x][y] = f[i - 1][x][y] + w(a[i])
\]

$ w(a[i]) $ 为以 a[i] 结尾的方案数。

\[w(a[i]) = \sum f[i - 1][y][z] \ \ \ \ (a[i] + y + z) \% 2 == 0
\]

最后需要把 \([a[i], y]\) 的对数加入 \(f[i][a[i]][y]\),以此更新下个数。

#include<bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i <= (b); ++ i)
#define per(i, a, b) for(int i = (a); i >= (b); -- i)
#define pb emplace_back
#define All(X) X.begin(), X.end()
using namespace std;
using ll = long long;
constexpr ll P = 998244353; int n, f[200005][2][2], cnt[2];
int ans; int main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
cin >> n;
rep(i, 1, n) {
int x; cin >> x;
x &= 1;
rep(y, 0, 1) rep(z, 0, 1) if((x + y + z) % 2 == 0) {
f[i][x][y] = (f[i][x][y] + f[i - 1][y][z]) % P;
ans = (ans + f[i - 1][y][z]) % P; // 以 a[i] 结尾的方案的贡献
} rep(y, 0, 1) rep(z, 0, 1) f[i][y][z] = (f[i][y][z] + f[i - 1][y][z]) % P; // 前缀和为前i个数的方案
rep(y, 0, 1) f[i][x][y] = (f[i][x][y] + cnt[y]) % P; // 统计 [x, y] 二元组的个数,由此更新 i + 1
++ cnt[x];
}
cout << ans;
return 0;
}

随机推荐

  1. 解密prompt系列25. RLHF改良方案之样本标注:RLAIF & SALMON

    上一章我们主要唠了RLHF训练相关的方案,这一章我们主要针对RLHF的样本构建阶段,引入机器标注来降低人工标注的成本.主要介绍两个方案:RLAIF,和IBM的SALMON. RLAIF RLAIF: ...

  2. 【已解决】IDEA项目启动时Maven报错:Downgrade Maven to version 3.8.1 or earlier in settings

    报错场景如下: Possible solutions: Check that Maven pom files not contain http repository http://mvn.gt.ige ...

  3. python 1992和2006年国家标准学科分类和代码标准化并存入MySQL数据库

    数据表 代码 1 import pandas as pd 2 import pymysql 3 4 5 def get_subject_1992(): 6 res={} 7 the_former_co ...

  4. LLM RAG系列

    RAG系列 本文介绍了RAG以及RAG pipeline的整个流程,包括请求转换.路由和请求构造.索引和检索.生成和评估等,其中引用了大量有价值的论文. 参考Advanced RAG Series: ...

  5. Visual Studio 2022的安装 - 编程手把手系列文章

    工欲善其事,必先利其器. 今天讲的是编程开发工具Visual Studio 2022的安装.作为手把手系列的开始,需要先对进行编程所使用的工具进行了解.此博文从下面几个步骤入手,对VS 2022这个开 ...

  6. #博弈论#Poj 2505 A multiplication game

    题目 给你一个整数\(n\),你从1开始乘,乘2-9之间的任意一个数. 最先得到大于等于\(n\)的数的人胜利.Stan先手Ollie后手. 那么,请问给你一个数\(n\),Stan和Ollie都足够 ...

  7. 诚邀报名丨首期OpenHarmony开发者成长计划分享日

     OpenAtom OpenHarmony(以下简称"OpenHarmony")开源开发者成长计划,是一项为了鼓励开发者积极参与开源软件的开发维护.帮助开发者在开源项目中成长的社会 ...

  8. Qt操作ini文件

    操作文件,无非就是读与写,以下为Qt读写ini文件的代码. demo: #include "widget.h" #include <QApplication> #inc ...

  9. react native 0.73 配置 react-native-fs

    安装react-native-fs npm npm install react-native-fs --save yarn yarn add react-native-fs 安卓配置 android/ ...

  10. 在HarmonyOS上实现ArkTS与H5的交互

      介绍 本篇Codelab主要介绍H5如何调用原生侧相关功能,并在回调中获取执行结果.以"获取通讯录"为示例分步讲解JSBridge桥接的实现. 相关概念 Web组件:提供具有网 ...