原题
「其一」
即使化身白骨,也有不想忘记的东西
已获得转载授权。
给定 n n n,请构造一个长度为 n n n 的仅包含 0 , 1 0,1 0,1 的数字串,满足 01 , 00 , 10 , 11 01,00,10,11 01,00,10,11 出现的次数相等。或报告无解。
这里“出现”指与原字符串中连续的一部分完全相同。例如,在 1011101 1011101 1011101 中, 01 , 00 , 10 , 11 01,00,10,11 01,00,10,11 分别出现了 2 , 0 , 2 , 2 2,0,2,2 2,0,2,2 次。
请注意,大样例不以文件附加形式给出,而直接放在题目的 输入输出样例 中的 样例 #3
一行一个正整数 n n n。
若有解,输出一行一个长度为 n n n 的满足条件的仅包含 0 , 1 0,1 0,1 的数字串。
若无解,输出 -1
。
3
-1
5
00110
15400
-1
【数据范围与提示】
测试点编号 | 分数 | n ≤ n\leq n≤ | 特殊性质 |
---|---|---|---|
1 ∼ 2 1\sim 2 1∼2 | 20 20 20 | 5 5 5 | 无 |
3 ∼ 4 3\sim 4 3∼4 | 20 20 20 | 1 0 6 10^6 106 | n m o d 4 = 0 n \bmod 4 = 0 nmod4=0 |
5 ∼ 6 5\sim 6 5∼6 | 20 20 20 | 20 20 20 | 无 |
7 ∼ 10 7 \sim 10 7∼10 | 40 40 40 | 1 0 6 10^6 106 | 无 |
剖析
第一点:
想要满足 01,00,10,11 出现的次数相等,间隔数必须是4的整数倍!
if ( ( n - 1 ) % 4 != 0 ) {//间隔数:(n-1)
cout << -1;
return 0;
}
第二点:
找规律,所有的合法答案都是:"0"+"0110"*m
cout << 0;
n = ( n - 1 ) / 4;
for ( long long int i = 1; i <= n; i++ ) {
cout << "0110";
}
代码
#include
using namespace std;
long long int n;
int main() {
cin >> n;
if ( ( n - 1 ) % 4 != 0 ) {
cout << -1;
return 0;
}
cout << 0;
n = ( n - 1 ) / 4;
for ( long long int i = 1; i <= n; i++ ) {
cout << "0110";//No cout << 0110;
}
}