题目链接:P11003 [蓝桥杯 2024 省 Python B] 蓝桥村的真相

这题一看数据范围 \(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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Hey there! Ask me anything!