链接: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;
}