Loading

牛客练习赛86 B. A + B(构造)

链接:https://ac.nowcoder.com/acm/contest/11176/B
来源:牛客网

题目描述

A + B ProblemA + B Problem 往往是大家在各Online JudgeOnline Judge通过的第一道题目,刚刚学会写程序的嘟嘟也不例外。然而,单纯的读入两个数字A,BA,B并输出它们的总和CC,对于聪明伶俐又可爱的牛牛来说实在是太简单了。富有挑战精神的她忍不住想:「假如只有A,B,CA,B,C三个数字视为字符串拼接起来后的结果ss,我有办法还原出当初的数字A,B,CA,B,C并满足A+B=CA+B=C吗?」

举例来说,如果 s="123"s="123",那么可以还原出 1+2=31+2=3

注意有前导零的数字和空是不能作为数字的,如 s="1023"s="1023",则不能被还原成 1+02=31+02=3。

嘟嘟想找出 NN 组有 KK 种还原方式的输入字符串 ss,但是她却心有余而力不足,身为她的朋友,你,便自告奋勇的来帮她找出 NN 组有 KK 种还原方式的输入!

输入描述:

输入只有一行,给出两个以空格分隔的正整数K,NK,N,代表嘟嘟想找出 NN 组有 KK 种还原方式的输入字符串。0≤K≤20≤K≤21≤N≤1001≤N≤100

输出描述:

请输出 NN 行,每行一个字符串 sisi,代表 sisi 有 kk 种还原的方法。 sisi 必须满足以下条件:
1≤∣si∣≤301≤∣si∣≤30
sisi 由数字 12345678901234567890 组成
si≠sj,∀i≠jsi=sj,∀i=j,即任两个输出字符串都不相等sisi 必须恰有 KK 种还原的方法如果有超过 NN 个满足条件的 sisi,按照任意顺序输出任意的 NN 个即可

示例1

输入

复制

2 1

输出

复制

11111122

示例2

输入

复制

0 1

输出

复制

1023

示例3

输入

复制

1 2

输出

复制

123
101

根据样例就能构造的差不多了,直接分k = 0, 1, 2三种情况构造:

k = 0:因为不能有前导0,因此只要串的第一个字符是0,剩下的只要不是回文串一定满足题意。

k = 1:构造1111 + 2222 = 3333, 2222 + 2222 = 4444这样(每一位对应起来,且不要有进位)。

k = 2:构造1110111,可以拆成111 + 0 = 111,也可以拆成1 + 110 = 111。

注意 si长度不超过30,因此需要对上面沟造出来的适当扩展一下位数。

#include <bits/stdc++.h>
using namespace std;
int main() {
	int n, k;
	cin >> k >> n;
	if(k == 0) {
		int cnt = 0;
		while(1) {
			if(cnt == n) break;
			for(int k = 1; k <= 8; k++) {
				if(cnt == n) break;
				for(int i = 1; i <= 14; i++) {
					if(cnt == n) break;
					cnt++;
					cout << 0;
					for(int j = 1; j <= i; j++) {
						cout << k;
					}
					for(int j = 1; j <= i; j++) {
						cout << k + 1;
					}
					cout << endl;
				}
			}
		}
	} else if(k == 1) {
		int cnt = 0;
		for(int k = 1; k <= 8; k++) {
			if(cnt == n) break;
			for(int i = 1; i <= 10; i++) {
				if(cnt == n) break;
				cnt++;
				for(int j = 1; j <= i; j++) cout << 1;
				for(int j = 1; j <= i; j++) cout << k;
				for(int j = 1; j <= i; j++) cout << k + 1;
				cout << endl;
			}
		}
		for(int k = 2; k <= 4; k *= 2) {//注意这里必须从2开始构造 不然会重复
			if(cnt == n) break;
			for(int i = 1; i <= 10; i++) {
				if(cnt == n) break;
				cnt++;
				for(int j = 1; j <= i; j++) cout << k;
				for(int j = 1; j <= i; j++) cout << k;
				for(int j = 1; j <= i; j++) cout << k + k;
				cout << endl;
			}
		}
	} else {
		int cnt = 0;
		for(int k = 1; k <= 9; k++) {
			if(cnt == n) break;
			for(int i = 2; i <= 14; i++) {
				if(cnt == n) break;
				cnt++;
				for(int j = 1; j <= i; j++) cout << k;
				cout << 0;
				for(int j = 1; j <= i; j++) cout << k;
				cout << endl;
			}
		}
	}
	return 0;
}
posted @ 2021-07-10 11:41  脂环  阅读(97)  评论(0编辑  收藏  举报