题目描述
在风景如画的蓝桥村,n 名村民围坐在一张古老的圆桌旁,参与一场思想的较量。这些村民,每一位都有着鲜明的身份:要么是誉满乡野的诚实者,要么是无可救药的说谎者。当会议的钟声敲响,一场关于真理与谬误的辩论随之展开。每位村民轮流发言,编号为 i 的村民提出了这样的断言:坐在他之后的两位村民——也就是编号 i + 1 和 i + 2(注意,编号是环形的,所以如果 i 是最后一个,则 i + 1 是第一个,以此类推)之中,一个说的是真话,而另一个说的是假话。在所有摇曳不定的陈述中,有多少真言隐藏在谎言的面纱之后?
请你探索每一种可能的真假排列组合,并计算在所有可能的真假组合中,说谎者的总数。
输入格式
输入的第一行包含一个整数 T,表示每次输入包含 T 组数据。
接下来依次描述 T 组数据。
每个数据一行包含一个整数 n,表示村落的人数。
输出格式
输出 T 行,每行包含一个整数,依次表示每组数据的答案。
样例输入
2 3 3
样例输出
6 6
提示
【样例说明】
在样例中,可能的组合有「假,假,假」「真,真,假」「真,假,真」「假,真,真」,说谎者的总数为 3 + 1 + 1 + 1 = 6。
【评测用例规模与约定】
对于 10% 的评测用例,T = 1,3 ≤ n ≤ 10。
对于 40% 的评测用例,1 ≤ T ≤ 102,3 ≤ n ≤ 3 × 103。
对于所有评测用例,1 ≤ T ≤ 105,3 ≤ n ≤ 1018。
解题思路
假设 1为真话 0为假话。
若 第i个村民为1 则后面两位为01或10;
若 第i个村民为0 则后面两位为00或11;
第一个为1 则他说的是真话 字符串应该为101或110,
若字符串为101 第二位为0 则第三四位应该为1 字符串为1011,
第三位为1 则 第4,5 位分别为1,0 或1,1
因为第4位为1 第5位为0 字符串应为10110,
以此类推 101101 1011011 10110110 1011011011
可以发现出现101字符串循环
若字符串为110 由上面类推则获得 110 循环
第一个为0 则他说的是假话 字符串应为 011 或 000
若为011
011
0110
011011
0110110
011011011
出现 011循环
同理 若为000
00000000000000000000000000000000 无限0循环
※题目不需要生成字符串,只需要统计0的个数
统计可能说谎者的总数 就是统计每种可能中 0 出现的次数
101循环中 每三个字符出现一次0 n/3
110循环同上 n/3
011循环同上 n/3
0循环每个字符都是0 n
将所有情况相加 结果为2n
※由于需要首尾相连 则101 110 011循环在 n%3!=0时 不符合条件 只有n次
代码
import sys
input = sys.stdin.read
data = input().split()
T = int(data[0])
results = []
for i in range(1, T + 1):
n = int(data[i])
if n % 3 == 0:
results.append(str(2 * n))
else:
results.append(str(n))
sys.stdout.write("\n".join(results) + "\n")