传送门

Description

Vitya is studying in the third grade. During the last math lesson all the pupils wrote on arithmetic quiz. Vitya is a clever boy, so he managed to finish all the tasks pretty fast and Oksana Fillipovna gave him a new one, that is much harder.

Let's denote a flip operation of an integer as follows: number is considered in decimal notation and then reverted. If there are any leading zeroes afterwards, they are thrown away. For example, if we flip 123 the result is the integer 321, but flipping 130 we obtain 31, and by flipping 31 we come to 13.

Oksana Fillipovna picked some number a without leading zeroes, and flipped it to get number ar. Then she summed a and ar, and told Vitya the resulting value n. His goal is to find any valid a.

As Oksana Fillipovna picked some small integers as a and ar, Vitya managed to find the answer pretty fast and became interested in finding some general algorithm to deal with this problem. Now, he wants you to write the program that for given n finds any a without leading zeroes, such that a + ar = n or determine that such a doesn't exist.

Input

The first line of the input contains a single integer n (1 ≤ n ≤ 10100 000).

Output

If there is no such positive integer a without leading zeroes that a + ar = n then print 0. Otherwise, print any valid a. If there are many possible answers, you are allowed to pick any.

Sample Input

4

11
5

33

Sample Output

2

10

0

21

Note

In the first sample 4 = 2 + 2, a = 2 is the only possibility.

In the second sample 11 = 10 + 1, a = 10 — the only valid solution. Note, that a = 01 is incorrect, because a can't have leading zeroes.

It's easy to check that there is no suitable a in the third sample.

In the fourth sample 33 = 30 + 3 = 12 + 21, so there are three possibilities for aa = 30, a = 12, a = 21. Any of these is considered to be correct answer.

思路

题意:给出数字n,问是否存在一个数x,使得 x + flip(x) = n (其中 flip(x)为x的反转,反转后忽略前导0)

题解:对于前后两个对称位置,如果相等,则ans[i]=(num[i]+1)/2,ans[n-i-1]=num[i]/2,若不相等,考虑两种情况,一种是来自低位的进位,一种是来自高位的退位

  • 当num[i] == num[n - i - 1] + 1 || num[i] == num[n - i - 1] + 11,说明第 i 位有来自低位的进位,因此将其还原即可,亦即使得num[i]--,num[i + 1] += 10;
  • 当num[i] == num[n - i - 1] + 10,说明第 i 位有来自高位的退位,因此使得第 n - i - 1 位也有来自高位的退位,,亦即使得num[n - i - 2]--,num[n - i - 1] += 10;

另外,对于n为 “1”开头的数值时,需要特判,因为这位1是由x 和 flip(x )相加而得的进位,至于大于 “1”的数字开头的数值不需要进位是因为 9 + 9  + 1 = 19,最多只能进1。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000005;
char s[maxn],res[maxn];
int num[maxn];

bool check(int n)
{
	for (int i = 0;i < n / 2;)
	{
		if (num[i] == num[n - i - 1])	i++;
		else if ((num[i] == num[n - i - 1] + 1) || (num[i] == num[n - i - 1] + 11))  //来自低位的进位
		{
			num[i]--;
			num[i + 1] += 10;
		}
		else if (num[i] == num[n - i - 1] + 10)     //来自高位的退位
		{
			num[n - i - 2]--;
			num[n - i - 1] += 10;
		}
		else	return false;
	}
	if (n % 2 == 1)
	{
		if ((num[n/2]%2 == 1) || (num[n/2] > 18) || (num[n/2] < 0))	return false;
		else	res[n/2] = num[n/2]/2 + '0';
	}
	for (int i = 0;i < n / 2;i++)
	{
		if (num[i] > 18 || num[i] < 0)	return false;
		res[i] = (num[i] + 1) / 2 + '0';
		res[n - i - 1] = num[i] / 2 + '0';
	}
	return res[0] > '0';
}

int main()
{
	scanf("%s",s);
	int len = strlen(s);
	for (int i = 0;i < len;i++)	num[i] = s[i] - '0';
	if (check(len))	puts(res);
	else if (s[0] == '1' && len > 1)   //为 “1”开头的数值进行特判
	{
		for (int i = 0;i < len;i++)	num[i] = s[i + 1] - '0';
		len--;
		num[0] += 10;
		if (check(len))	puts(res);
		else	puts("0");
	}
	else	puts("0");
	return 0;
}

  

Codeforces Round #342 (Div. 2) D. Finals in arithmetic(想法题/构造题)的更多相关文章

  1. Codeforces Round #342 (Div. 2) D. Finals in arithmetic 贪心

    D. Finals in arithmetic 题目连接: http://www.codeforces.com/contest/625/problem/D Description Vitya is s ...

  2. Codeforces Round #342 (Div. 2) C. K-special Tables(想法题)

    传送门 Description People do many crazy things to stand out in a crowd. Some of them dance, some learn ...

  3. Codeforces Round #342 (Div. 2)

    贪心 A - Guest From the Past 先买塑料和先买玻璃两者取最大值 #include <bits/stdc++.h> typedef long long ll; int ...

  4. Codeforces Round #342 (Div. 2) C. K-special Tables 构造

    C. K-special Tables 题目连接: http://www.codeforces.com/contest/625/problem/C Description People do many ...

  5. Codeforces Round #342 (Div. 2) B. War of the Corporations 贪心

    B. War of the Corporations 题目连接: http://www.codeforces.com/contest/625/problem/B Description A long ...

  6. Codeforces Round #342 (Div. 2) A - Guest From the Past 数学

    A. Guest From the Past 题目连接: http://www.codeforces.com/contest/625/problem/A Description Kolya Geras ...

  7. Codeforces Round #342 (Div. 2) E. Frog Fights set 模拟

    E. Frog Fights 题目连接: http://www.codeforces.com/contest/625/problem/E Description stap Bender recentl ...

  8. Codeforces Round #342 (Div. 2) B. War of the Corporations(贪心)

    传送门 Description A long time ago, in a galaxy far far away two giant IT-corporations Pineapple and Go ...

  9. Codeforces Round #342 (Div. 2) A. Guest From the Past(贪心)

    传送门 Description Kolya Gerasimov loves kefir very much. He lives in year 1984 and knows all the detai ...

随机推荐

  1. 开发者调试工具Chrome Workspace

    Workspace是个什么样的东西呢?他能够在开发者工具中调试修改js或者css同时自动保存文件,能够避免开发人员在工具中调试好,再到编辑器中修改一次代码的重复操作,能够提高一定的效率 配置Chrom ...

  2. 对iOS后台模式最多10分钟运行时间的进一步理解

    在app进入后台时,系统初始默认是只有10s的处理时间,但如果10s不够,我们可以主动申请,网上流传最多的一个说法是10分钟. 但这种说法有个前提: 那就是iOS7之前,是这样 但从iOS7开始,我们 ...

  3. x01.Weiqi.11: 神来之笔

    在围棋中,一子两用,可谓妙手,而一子三用,则可称之为神来之笔.在解决征子问题时,一不小心,也来了个神来之笔,其代码如下: // 征子判断,p1, p2 为气,p2 为前进方向,p 为逃跑之子. boo ...

  4. JavaScript函数的概念

    函数是这样的一段代码,它只定义一次,但可能被执行或调用任意多次. JavaScript函数是参数化的:函数的定义会包含形参,这些参数在函数的整体中像局部变量一样工作.函数调用时会为形参提供实参的值.除 ...

  5. Windows Live Writer测试

    第一次使用Windows Live Writer,一堆问题,不知道是中国强大的局域网防火墙问题还是咋的,弄了半天. 1.C++的测试代码: int _tmain(int argc, _TCHAR* a ...

  6. NIO与AIO,同步/异步,阻塞/非阻塞

    1.flip(),compact(),与clear()的使用 flip()内部实现,先将limit设为当前位置,再将缓冲区的postion设为0,所以是为将缓冲区的数据写出到其它通道或者get()作准 ...

  7. Java:类与继承

    Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关知 ...

  8. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  9. java 单例

    Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例.饿汉式单例. 饿汉式和懒汉式区别 从名字上来说,饿汉和懒汉, 饿汉就是类一旦加载,就把单例初始化完成,保证 ...

  10. CF219D. Choosing Capital for Treeland [树形DP]

    D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...