这题一看数据范围 $n\leq 10^{18}$ 就知道暴力会超时,所以这题一定有规律可循。
找规律:(以下 1 代表 true,0 代表 false)
题意:
当一个人为 $1$ 时,后面两个人只能为 $01$ 或 $10$。
当一个人为 $0$ 时,后面两个人只能为 $00$ 或 $11$。
第一位为 1
接 01
字符串变为 $101$,第二位为 $0$,且 $0$ 之后一定为 $00$ 或者 $11$,且第三位为 $1$,所以第四位一定为 $1$,字符串变 为:$1011$。
依此规律向下推,依次为 $10110$,$101101$,$1011011$,$10110110$。
可见一直出现 $101$,即当 $n$ 整除 $3$ 时,每三位中都出现一次假,总共有 $\frac{n}{3}$ 个假,答案加上 $\frac{n}{3}$。
接 10
依次推理,为 $110$,$1101$,$11011$,$110110$,$1101101$,$11011011$。
可见一直出现 $110$,即当 $n$ 整除 $3$ 时,每三位中都出现一次假,总共有 $\frac{n}{3}$ 个假,答案再加上 $\frac{n}{3}$。
第一位为 0
接 11
也不难得到 $011$,$0110$,$01101$,$011011$,$0110110$,$01101101$。
可见一直出现 $011$,即当 $n$ 整除 $3$ 时,每三位中都出现一次假,总共有 $\frac{n}{3}$ 个假,答案再加上 $\frac{n}{3}$。
接 00
分别得到 $000$,$0000$,$00000$,$000000$,$0000000$,$00000000$。
无论 $n$ 为几,都出现 $n$ 次假,答案加上 $n$。
总结
当 $n$ 整除 $3$ 时,答案为
$$
\frac{n}{3}+\frac{n}{3}+\frac{n}{3}+n=2\times n
$$
当 $n$ 不整除 $3$ 时,答案就为 $n$,即 $n$ 个假相接。
代码:
c++
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline void solve()
{
int n;
cin>>n;
cout<<(!(n%3)?(n*2):n)<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--)solve();
return 0;
}
介于是 Python 组的题目,也放一下 Python 代码
Python
t=int(input())
for _ in range(t):
n=int(input())
if n%3==0:
print(n*2)
else:
print(n)