首页 > 其他分享 >n1gr tS0i 题解

n1gr tS0i 题解

时间:2024-08-17 15:26:41浏览次数:12  
标签:geq 01 题解 tt n1gr input 操作 tS0i

前言

题目链接:洛谷

想了一个小时,想到后只用 \(1\) 分钟过了的题。

官方题解过于晦涩,看到一篇很清晰的题解,于是写题解以记之。

终于遇到时间瓶颈在输入的题目。

题意简述

有一个长度为 \(n\) 的 \(\tt 01\) 串 \(S\),你要对 \(S\) 进行 恰好 \(n\) 次操作。每次操作选择 \(1 \leq l {\color{red}{<}} r \leq n\),然后按位翻转 \(S_{l\dots r}\)。

求 \(n\) 次操作后,所有可能不同的 \(S\) 的个数模 \(998244353\) 的余数。\(2 \leq n \leq 10^5\)。

题目分析

经过大量模拟,发现在 \(n \geq 4\) 时答案就是 \(2^n\),于是愉快地过了这题。考虑证明。

发现既然为 \(2^n\),说明最终能到达所有长为 \(n\) 的 \(\tt 01\) 串,由于操作的可逆性,所有 \(\tt 01\) 串是能够相互转化的。换句话说,和输入的 \(S\) 是没有关系的。自然把问题转移到一个新的 \(\tt 01\) 串 \(T\) 上,其每一位表示 \(S\) 的这一位和最终的串的这一位相等或是不等。要证明答案是 \(2^n\),说明我们总能从全 \(0\) 串变成任意的 \(T\)。

考虑用归纳法。由于操作长度要 \(\geq 2\),假设前 \(n - 2\) 已经匹配,我们要用恰好 \(2\) 次操作弄好后两位。现在要做的就是分类讨论这 \(2\) 位可能的 \(4\) 种情况,并构造出对应的操作。为了方便表述,不妨拿出这 \(2\) 位和后面相邻的 \(2\) 位,构成长度为 \(4\) 的子串。

  1. 形如 \(\tt 00xx\)。
    两次操作分别是:\([1, 2]\),\([1, 2]\)。
  2. 形如 \(\tt 01xx\)。
    两次操作分别是:\([2, 4]\),\([3, 4]\)。
  3. 形如 \(\tt 10xx\)。
    两次操作分别是:\([1, 4]\),\([2, 4]\)。
  4. 形如 \(\tt 11xx\)。
    两次操作分别是:\([1, 4]\),\([3, 4]\)。

要完成以上操作,必要的条件是 \(n \geq 4\)。如果此时没有后两位 \(\tt xx\) 的辅助,我们可以借用前面的两位。

自此,我们证明了结论对于 \(\geq 4\) 的所有偶数是成立的。当 \(n\) 为奇数时,如果最后一位是 \(1\),就随便翻转 \([k, n]\),其中 \(k\) 是 \([1, n - 1]\) 里任意一位,先把最后一位满足了,对于前 \(n - 1\) 位再用之前的方法搞好;如果最后一位是 \(0\),那就浪费一次操作,任选 \(l < r < n\),翻转 \([l, r]\) 即可。

证明就结束了,十分简单。再用形式化的语言表达答案:

\[ans = \begin{cases} 1 & \text{ if } n=2 \\ 4 & \text{ if } n=3 \\ 2^n & \text{ if } n \geq 4 \end{cases} \]

算法时间复杂度为 \(\Theta(\log n)\),但是输入有瓶颈,是 \(\Theta(n)\) 的。

代码

t = int(input())
while t:
    n = int(input())
    input()
    if n == 2:
        print(1)
    elif n == 3:
        print(4)
    else:
        print((1 << n) % 998244353)
    t -= 1

以及:

for _ in range(int(input())):n=int(input());input();print({2:1,3:4}[n]if n<=3 else(1<<n)%998244353)

标签:geq,01,题解,tt,n1gr,input,操作,tS0i
From: https://www.cnblogs.com/XuYueming/p/18364388

相关文章

  • 洛谷 B3735 B3736 B3787 题解
    嘿嘿我发烧已经好了!题目目录:No.1 B3735[信息与未来2018]圣诞树No.2 B3736[信息与未来2018]最大公约数No.3 B3787[信息与未来2023]精密计时 OK,开始正文!第一题:B3735[信息与未来2018]圣诞树 题目描述圣诞树共有 nn 层,从上向下数第 11 层有 11 个......
  • 题解:AT_arc181_b [ARC181B] Annoying String Problem
    思路首先我们可以根据两个字符串算出另外一个字符串\(T\)的长度。算出来之后,因为我们要满足等式两边完全相等,所以很容易得出这两个字符串应该都是由一些公共的字串拼接而成的。设\(S\)串中最小的周期为\(P\)。所以应该满足\(|P|\Large{\mid}\normalsize\gcd(|S|,|T|)\)......
  • 题解:AT_arc182_a [ARC182A] Chmax Rush!
    思路因为前面不允许出现比这次的替换的值还要大的情况,所以如果我们知道下标\(i,j\)满足\(i<j\)且\(V_i>V_j\)的话,我们就必须把它们两次修改分开。具体地:若\(P_i<P_j\):此时,我们只能将\([1,P_i]\)的值设为\(V_i\),将\([P_j,n]\)的值设为\(V_j\)。若\(P_i>P_j\):此......
  • P8735 蓝跳跳 题解
    Statement给出\(k,p,L\),数序列\(a\),满足如下条件:\(1\lea_i\lek\)\(\sum_ia_i=L\)\(\nexistsi,a_i\gep\landa_{i+1}\gep\)答案对\(20201114\)取模,\(p\lek\le1000,L\le10^{18}\).Solution30pts注意到可以dp,记\(f(i,0/1)\)为凑出\(i\)的方案......
  • 信息学奥赛一本通编程启蒙题解(3011~3015)
    前言Hello大家好,我是文宇.正文3011#include<iostream>usingnamespacestd;intmain(){ inta,b,s; a=880; b=500; s=a*b; cout<<s; return0;}注:没有输入的都可以直接输出.3012#include<iostream>usingnamespacestd;inta,b,t;intmain(){ a=10;b=20......
  • 信息学奥赛一本通编程启蒙题解(3021~3025)
    前言hello大家好,我是文宇。正文3021#include<iostream>usingnamespacestd;inta,b,c,d;intmain(){ cin>>a>>b>>c>>d; cout<<a+b+c+d; return0;}3022#include<bits/stdc++.h>usingnamespacestd;intmain(){ inta,b,c; ......
  • CF704E Iron Man 题解
    Description“铁人”yyb在玩游戏。在一个\(n\)个点的树上,yyb放置了\(m\)个鸡贼。每个鸡贼有四个整数参数\(t_i,c_i,v_i,u_i\),表示这个鸡贼会在\(t_i\)时刻出现在点\(v_i\),并以每时刻\(c_i\)条边的速度向\(u_i\)点匀速移动,到达\(u_i\)点时立刻消失。如果一个时刻......
  • 【题解】「NOIP2012」疫情控制
    https://www.luogu.com.cn/problem/P1084这道题难在贪心的思路,实现比较简单可以直接看代码。首先二分。现在转化为判定问题。可以用倍增求出每个军队最上面能到哪。结论1:我们一定不会把在除了根节点以外的军队往下移动。否则肯定不优。所以我们把能走到根节点的先存在一起......
  • [题解] [HNOI2016] 序列
    原题链接题面给定长度为$n$的序列:$a_1,a_2,\cdots,a_n$,记为\(a[1\colonn]\)。类似地,\(a[l\colonr]\)($1\leql\leqr\leqN$)是指序列:$a_{l},a_{l+1},\cdots,a_{r-1},a_r$。若\(1\leql\leqs\leqt\leqr\leqn\),则称$a[s\colont]$是$a[......
  • 2024杭电多校第十场 1002树上询问(题解)
    题意给一棵树,每个节点有一个权值,并且权值是一个排列。接下来有多次操作,每次操作要么是交换两个节点权值,要么是询问一个权值区间\([L,R]\),判断是否存在树上的一个路径,使得路径上的权值恰好都在这个区间里分析由于询问的是树上的一个路径,联想到了树上莫队中对路径的处理。这里......