• @atcoder



    @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
    ", ans);
    }
    

    @detail@

    老年选手连 AGC 的 C 题都做不出来了 QAQ。
    整了一个上午 + 一个晚上,最后还是看了题解 QAQ。

    感觉主要是。。。想不到根据位置的奇偶性来分析吧。。。
    吃一堑,长一智.jpg。

    为什么 AGC 这么喜欢出这种类型的题啊 QAQ。
    人类智慧实在是太强大了 QAQ。

  • 相关阅读:
    python torch安装下载地址
    anaconda windows常用命令
    VBA手册
    聊聊FLINK25631贡献
    适配若依框架的字典翻译
    ROS使用catkin_make编译
    Linux_软件安装和Dockerfile
    云计算_Dockerfile与代理
    CI/CD_Git大文件问题定位和排查
    C++_标准库和第三方库
  • 原文地址:https://www.cnblogs.com/Tiw-Air-OAO/p/11796562.html
Copyright © 2020-2023  润新知