P8589 『JROI-8』对了,还有花,少女,银河

原题

『JROI-8』对了,还有花,少女,银河

题目背景

「其一」
即使化身白骨,也有不想忘记的东西

已获得转载授权。

题目描述

给定 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

样例 #1

样例输入 #1

3

样例输出 #1

-1

样例 #2

样例输入 #2

5

样例输出 #2

00110

样例 #3

样例输入 #3

15400

样例输出 #3

-1

提示

【数据范围与提示】

测试点编号 分数 n ≤ n\leq n 特殊性质
1 ∼ 2 1\sim 2 12 20 20 20 5 5 5
3 ∼ 4 3\sim 4 34 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 56 20 20 20 20 20 20
7 ∼ 10 7 \sim 10 710 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";
}

P8589 『JROI-8』对了,还有花,少女,银河_第1张图片

代码

#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;
	}
}

P8589 『JROI-8』对了,还有花,少女,银河_第2张图片

你可能感兴趣的:(1024程序员节,c++)