思路:开始并不会,上网搜的题解。
假设删掉
A
中第k+1位
A=a+b∗10k+c∗10k+1
B=a+c∗10k
N=2a+(b+11c)∗10k
所以
N%10k=(b+11c)
,
c=(N%10k)/11
注意
a<10k
,但是
2∗a
可能产生进位
b
最大只可能是9,所以就算a进位了也不会影响c的结果。对于进位的情况分类讨论即可。可能会有重的,譬如5002,需要去重。
http://acm.hdu.edu.cn/showproblem.php?pid=1271
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define rep(i,a,b) for(int i = (a) ; i <= (b) ; i ++)
#define rrep(i,a,b) for(int i = (b) ; i >= (a) ; i --)
#define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next)
#define cls(a,x) memset(a,x,sizeof(a))
#define eps 1e-8
using namespace std;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5+5;
const int MAXE = 2e5+5;
typedef long long LL;
typedef unsigned long long ULL;
int T,n,m,k;
int fx[] = {0,1,-1,0,0};
int fy[] = {0,0,0,-1,1};
int base[11];
void init() {
base[0] = 1;
rep(i,1,9) base[i] = base[i-1] * 10;
}
void input() {
}
int a,b,c,N;
int ans[20];
int tot ;
void solve() {
tot = 0;
rep(i,0,9) {
if(N >= base[i]) {
if((N % base[i])&1)continue;
int bc = N / base[i];
c = bc / 11;
b = bc % 11;
a = (N % base[i]) / 2;
if(b == 10) {
if(i == 0) continue;
b --;
a += base[i] / 2;
ans[++tot] = a + (b + 10*c) * base[i];
continue;
}
ans[++tot] = a + (b + 10*c) * base[i];
if(i > 0 && b >= 1) {
b --;
if(b == 0 && c == 0) continue;
a += base[i] / 2;
ans[++tot] = a + (b + 10*c) * base[i];
}
}
}
if(tot == 0) {
puts("No solution.");
}
else {
sort(ans+1,ans+tot+1);
printf("%d",ans[1]);
rep(i,2,tot) {
if(ans[i] != ans[i-1]) printf(" %d",ans[i]);
}
puts("");
}
}
int main(void) {
init();
while(scanf("%d",&N),N) {
input();
solve();
}
return 0;
}