@description@

给定偶数 N,求由 'A', 'B', 'C' 三种字符组成的字符串 S,有多少满足如下的条件:

每次可以选择 S 中的两个相邻字符(不能选择 "AB" 与 "BA"),删除它们。最后可以将 S 删成空串。

比如:"ABBC" -> "AC" -> ""。所以 "ABBC" 对于 N = 4 时是合法的。

将最终答案 mod 998244353。

Constraints

2≤N≤10^7, 并保证 N 为偶数

Input

输入形式如下:

N

Output

输出答案 mod 998244353。

Sample Input 1

2

Sample Output 1

7

除了 "AB", "BA" 都可行。

@solution@

考虑删除连续 2 个字符,哪些东西不会变化。

这时你会惊讶地发现:一个字符在字符串中的所处位置的奇偶性不会变化。

其实挺容易验证。假如在删除的前面,不会影响;假如在删除的后面,位置向前移动 2,奇偶不变。

那么一个奇数位置上的 "A" 与一个偶数位置上的 "B" 永远不可能互相消;一个偶数位置上的 "B" 与一个奇数位置上的 "A" 也永远不可能互相消。这些字符需要其他的字符消掉。

记 S1 = 奇数位置的 "A" 数量 + 偶数位置的 "B" 数量,那么应有 2*S1 <= N。

同理记 S2 = 奇数位置的 "B" 数量 + 偶数位置的 "A" 数量,那么应有 2*S2 <= N。

其实以上两个条件 (2*S1 <= N, 2*S2 <= N) 就是充要条件。

可以归纳验证。假如 2*S1 = N, 2*S2 = N 同时满足,则我们可以同时消 S1 与 S2;否则我总是消 S1 与 S2 的较大值。

那么最终答案就是 3^N - (2*S1 > N 的方案数) - (2*S2 > N 的方案数)。

随便组合计数一下就没了。

@accepted code@

#include <cstdio>
const int MOD = 998244353;
const int MAXN = 10000000;
int sub(int x, int y) {return x - y < 0 ? x - y + MOD : x - y;}
int pow_mod(int b, int p) {
int ret = 1;
while( p ) {
if( p & 1 ) ret = 1LL*ret*b%MOD;
b = 1LL*b*b%MOD;
p >>= 1;
}
return ret;
}
int pw2[MAXN + 5], fct[MAXN + 5], ifct[MAXN + 5];
void init() {
pw2[0] = 1;
for(int i=1;i<=MAXN;i++)
pw2[i] = 2LL*pw2[i-1]%MOD;
fct[0] = 1;
for(int i=1;i<=MAXN;i++)
fct[i] = 1LL*fct[i-1]*i%MOD;
ifct[MAXN] = pow_mod(fct[MAXN], MOD-2);
for(int i=MAXN-1;i>=0;i--)
ifct[i] = 1LL*ifct[i+1]*(i+1)%MOD;
}
int comb(int n, int m) {
return 1LL*fct[n]*ifct[m]%MOD*ifct[n-m]%MOD;
}
int main() {
init(); int N;
scanf("%d", &N);
int ans = pow_mod(3, N);
for(int i=N/2+1;i<=N;i++)
ans = sub(ans, 2LL*comb(N, i)*pw2[N-i]%MOD);
printf("%d\n", ans);
}

@detail@

老年选手连 AGC 的 C 题都做不出来了 QAQ。

整了一个上午 + 一个晚上,最后还是看了题解 QAQ。

感觉主要是。。。想不到根据位置的奇偶性来分析吧。。。

吃一堑,长一智.jpg。

为什么 AGC 这么喜欢出这种类型的题啊 QAQ。

人类智慧实在是太强大了 QAQ。

最新文章

  1. ReactJS webpack实现JS模块化使用的坑
  2. 二、IRIG_B解码AC信号
  3. 命令 tar &amp; zip
  4. Python Paste.deploy 笔记
  5. linux下安装memcached过程
  6. 三星S5360(GALAXY Y)首次刷机尝试~
  7. WIN7/8系统下程序接收不到WM_COPYDATA 消息的原因和解决
  8. HDU 1076 An Easy Task
  9. 【iOS】Mapkit的使用:地图显示、定位、大头针、气泡等
  10. Android---60---Notification 通知栏的简单使用
  11. Docker aufs存储驱动layer、diff、mnt目录的区别
  12. 【Beta】阶段 第四次Daily Scrum Meeting
  13. Python之函数基础
  14. 新版Azure CDN HTTPS加速服务正式上线
  15. ElasticSearch入门点滴
  16. mui组件 输入表单 快捷键mf
  17. Oracle JDK迁移指南
  18. P2064进制转换
  19. 关于xampp默认安装后mysql/mariadb密码的修改
  20. SQLServer2008只能编辑前面200行数据

热门文章

  1. es6模块化规则(一)
  2. mit课程ocw-business
  3. cookie-在关闭浏览器之前弹框只弹一次
  4. 【solr】Solr5.5.4+Zookeeper3.4.6+Tomcat8搭建SolrCloud集群
  5. INotitypropertyChanged
  6. Markdown文档使用
  7. jframe 设置左上角和任务栏的图标
  8. ckfinder图片上传成功,但无法打开This image failed to load.
  9. GIT → 04:Git与代码托管平台
  10. redis jedis存储对象简单操作,map list 自定义对象