codeforces #342 div 2 D. Finals in arithmetic
http://codeforces.com/contest/625/problem/D 题意:问能否找到一个s,满足s+s的反转=k 思路:如果是回文数。。。那么显然满足。除以2就可以得到答案。
1 如果不是回文数。。那么考虑进位的情况。
2 要么从后一位进1,要么从前一位退10回来。
3 需要特殊考虑1开头的。
4
5
6
7/* ***********************************************
8Author :111qqz
9Created Time :2016年02月07日 星期日 18时28分39秒
10File Name :code/cf/#342/D.cpp
11************************************************ */
12
13#include <cstdio>
14#include <cstring>
15#include <iostream>
16#include <algorithm>
17#include <vector>
18#include <queue>
19#include <set>
20#include <map>
21#include <string>
22#include <cmath>
23#include <cstdlib>
24#include <ctime>
25#include <sstream>
26#define fst first
27#define sec second
28#define lson l,m,rt<<1
29#define rson m+1,r,rt<<1|1
30#define ms(a,x) memset(a,x,sizeof(a))
31typedef long long LL;
32#define pi pair < int ,int >
33#define MP make_pair
34
35using namespace std;
36const double eps = 1E-8;
37const int dx4[4]={1,0,0,-1};
38const int dy4[4]={0,-1,1,0};
39const int inf = 0x3f3f3f3f;
40const int N=1E5+7;
41bool vis[N];
42
43void pre()
44{
45 ms(vis,false);
46 for ( int i = 10 ; i <12000 ; i++)
47 {
48 int vala = i ;
49 stringstream ss;
50 ss<<vala;
51 string tmp = ss.str();
52
53 reverse(tmp.begin(),tmp.end());
54
55 int valb;
56 sscanf(tmp.c_str(),"%d",&valb);
57// cout<<i<<" "<<vala+valb<<endl;
58 if (vala+valb<N) vis[vala+valb] = true;
59
60 }
61
62 for ( int i = 1 ; i < N ; i++)
63 {
64 if (vis[i]) cout<<i<<endl;
65 }
66}
67char ans[N],s[N];
68int n;
69int sum[N];
70
71bool ok()
72{
73 // cout<<"n:"<<n<<endl;
74 for ( int i = 0 ; i < n/2 ;)
75 {
76 int l = i ;
77 int r = n-1-i;
78 if (sum[l]==sum[r]) i++;
79 else if (sum[l]==sum[r]+1||sum[l]==sum[r]+11)
80 {
81 sum[l]--;
82 sum[l+1]+=10;
83 }
84 else if (sum[l]==sum[r]+10)
85 {
86 sum[r-1]--;
87 sum[r]+=10;
88
89 }
90 else return false;
91 }
92
93 if (n%2==1)
94 {
95 if (sum[n/2]%2==1) return false;
96 if (sum[n/2]>18||sum[n/2]<0) return false;
97 ans[n/2] = char(sum[n/2]/2 +'0');
98// cout<<"ASDHJKASD"<<endl;
99 }
100 for ( int i = 0 ; i < n/2 ; i++)
101 {
102 if (sum[i]<0||sum[i]>18) return false;
103 ans[i] =(sum[i]+1)/2+'0';
104 ans[n-1-i] =sum[i]/2+'0';
105 }
106 return ans[0]>'0';
107}
108int main()
109{
110 #ifndef ONLINE_JUDGE
111 freopen("code/in.txt","r",stdin);
112 #endif
113
114 //pre();
115 //
116
117 scanf("%s",s);
118 n = strlen(s);
119 for ( int i = 0 ; i < n ; i++) sum[i] = s[i] - '0';
120 if (ok())
121 {
122 cout<<ans<<endl;
123// cout<<"aaa"<<endl;
124 return 0;
125 }
126
127 if (s[0]=='1'&&n>1)
128 {
129 for ( int i = 0 ; i < n ; i++)
130 sum[i] = s[i+1]-'0';
131 sum[0]+=10;
132 n--;
133 if (ok())
134 {
135 cout<<ans<<endl;
136 return 0;
137 }
138 else
139 puts("0");
140 }
141 else puts("0");
142
143
144 #ifndef ONLINE_JUDGE
145 fclose(stdin);
146 #endif
147 return 0;
148}