Bootstrap

第十五届蓝桥杯省赛PythonB组E题【蓝桥村的真相】题解(AC)

请添加图片描述
请添加图片描述
请添加图片描述

题意分析

下文中 1 1 1 表示 0 0 0 表示

  • 由于 1 1 1 是真话,所以 1 1 1 的背后一定为 01 01 01 或者 10 10 10
  • 由于 0 0 0 是假话,所以 0 0 0 的背后一定为 00 00 00 或者 11 11 11

故题目的意思为,构造长度为 n n n 01 01 01 字符串,有多少个字符串中的所有字符满足上述条件。


假设一个字符串 s s s 的第一位为 1 1 1

根据上述规则,我们先讨论这个 1 1 1 背后接着 01 01 01,那么字符串为:
101

第二位为 0 0 0,且 0 0 0 的背后一定为 00 00 00 或者 11 11 11,且第三位为 1 1 1,所以第四位一定为 1 1 1,字符串变为:

1011

同理:

10110
101101
1011011
...

由于字符串首尾相接,当出现 n = 4 , 5 , 7 , 8 , … n = 4, 5, 7, 8, \dots n=4,5,7,8, 时,最后一个字符不符合构造条件。

综上,当 n % 3 = 0 n \% 3 = 0 n%3=0 时,循环节为 101,每 3 3 3 位中必存在一个 0 0 0,答案加上 n / 3 n / 3 n/3



接下来我们讨论,当第一位为 1 1 1 时,后头接着 10 10 10 的情况。
110

第二位为 1 1 1,且 1 1 1 的背后一定为 01 01 01 或者 10 10 10,且第三位为 0 0 0,所以第四位一定为 1 1 1,字符串变为:

1101

同理:

11011
110110
1101101
...

由于字符串首尾相接,当出现 n = 4 , 5 , 7 , 8 , … n = 4, 5, 7, 8, \dots n=4,5,7,8, 时,最后一个字符不符合构造条件。

综上,当 n % 3 = 0 n \% 3 = 0 n%3=0 时,循环节为 110,每 3 3 3 位中必存在一个 0 0 0,答案加上 n / 3 n / 3 n/3



假设一个字符串 s s s 的第一位为 0 0 0

根据上述规则,我们先讨论这个 0 0 0 背后接着 11 11 11,那么字符串为:
011

第二位为 1 1 1,且 1 1 1 的背后一定为 01 01 01 或者 10 10 10,且第三位为 1 1 1,所以第四位一定为 0 0 0,字符串变为:

0110

同理:

01101
011011
0110110
...

由于字符串首尾相接,当出现 n = 4 , 5 , 7 , 8 , … n = 4, 5, 7, 8, \dots n=4,5,7,8, 时,最后一个字符不符合构造条件。

综上,当 n % 3 = 0 n \% 3 = 0 n%3=0 时,循环节为 011,每 3 3 3 位中必存在一个 0 0 0,答案加上 n / 3 n / 3 n/3



接下来我们讨论,当第一位为 0 0 0 时,后头接着 00 00 00 的情况。
000

第二位为 0 0 0,且 0 0 0 的背后一定为 00 00 00 或者 11 11 11,且第三位为 0 0 0,所以第四位一定为 0 0 0,字符串变为:

0000

同理:

00000
000000
0000000
...

无论 n n n 为多少均存在答案,答案加上 n n n


总结

综上所述,当 n % 3 = 0 n \% 3 = 0 n%3=0 时,上述四种情况答案之和为:

n 3 + n 3 + n 3 + n \frac n 3 + \frac n 3 + \frac n 3 + n 3n+3n+3n+n

化简得 2 n 2n 2n

n % 3 ≠ 0 n \% 3 \neq 0 n%3=0 时,上述仅有第四种情况存在答案,故答案为 n n n

【在线测评】

import sys
sys.setrecursionlimit(1000000)
input = lambda:sys.stdin.readline().strip()

T = int(input())
for _ in range(T):
    n = int(input())
    if n % 3 == 0:
    	print(2 * n)
    else:
    	print(n)

【在线测评】

在这里插入图片描述

;