题意分析
下文中 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)