CF1912E

最近正在练构造题,写篇题解分享一下实现的细节。

核心过程

大胆猜测,不难发现一个重要的结论:假设有一个式子 \(a+a-0\),则其从左往右的结果为 \(2a\),从右往左的结果为 \(0\)。有了这个结论,我们就可以考虑用两段这样的式子来分别求得 \(p\)\(q\)。接下来分析细节。

上述结论的使用前提为 \(p,q\) 均为偶数。如果 \(p,q\) 不为偶数则需进行处理。下面进行分类讨论:

  • \(p,q\) 均为奇数

不难想到,可以给 \(p,q\) 都加上(或减去)一个奇数。直接输出一个奇数即可,两端符号最好相同。

  • \(p,q\) 中有一个为奇数

由于两个数的运算方向相反,因此可以选择一个最高位和最低位奇偶性不同的数。输出即可,两端符号最好相同。

注意到题目还有一个限制,即不能出现前导零。因此在进行上述操作后还要进行判断,若有前导零可以通过加上(或减去)一个偶数来满足。

最后还要留意构造 \(q\) 的部分输出时要倒序输出

Code

具体细节实详见代码。

#include <iostream>
#include <cstdio>
#define int long long

using namespace std;

signed main()
{
	int a,b,c = 0,e;
	cin >> a >> b;
	if( a % 2 && b % 2 )
	{	
		cout << "0-11-0";
		a += 11;
		b += 11;
		e = 2;
		while( ( a - e ) / 2 % 10 == 0 || ( b - e ) / 2 % 10 == 0 ) e += 2;
		cout << "+" << e << "+0";
		a -= e;
		b -= e;
		if( a < 0 ) cout << a / 2 << a / 2 << '+';
		else cout << '+' << a / 2 << '+' << a / 2 << '-';
		cout << "0";
		b /= 2;
		do
		{
			c = c * 10 + b % 10;
			b /= 10;
		}
		while( b );
		b = c;
		if( b < 0 ) cout << '+' << - b << b << '-';
		else cout << '-' << b << '+' << b << '+';
		cout << "0";
	}
	else if( a % 2 )
	{
		cout << "0-21-0";
		a += 21;
		b += 12;
		e = 2;
		while( ( a - e ) / 2 % 10 == 0 || ( b - e ) / 2 % 10 == 0 ) e += 2;
		cout << "+" << e << "+0";
		a -= e;
		b -= e;
		if( a < 0 ) cout << a / 2 << a / 2 << '+';
		else cout << '+' << a / 2 << '+' << a / 2 << '-';
		cout << "0";
		b /= 2;
		do
		{
			c = c * 10 + b % 10;
			b /= 10;
		}
		while( b );
		b = c;
		if( b < 0 ) cout << '+' << - b << b << '-';
		else cout << '-' << b << '+' << b << '+';
		cout << "0";
	}
	else if( b % 2 )
	{
		cout << "0-12-0";
		a += 12;
		b += 21;
		e = 2;
		while( ( a - e ) / 2 % 10 == 0 || ( b - e ) / 2 % 10 == 0 ) e += 2;
		cout << "+" << e << "+0";
		a -= e;
		b -= e;
		if( a < 0 ) cout << a / 2 << a / 2 << '+';
		else cout << '+' << a / 2 << '+' << a / 2 << '-';
		cout << "0";
		b /= 2;
		do
		{
			c = c * 10 + b % 10;
			b /= 10;
		}
		while( b );
		b = c;
		if( b < 0 ) cout << '+' << - b << b << '-';
		else cout << '-' << b << '+' << b << '+';
		cout << "0";
	}
	else
	{
		cout << "0";
		e = 2;
		while( ( a - e ) / 2 % 10 == 0 || ( b - e ) / 2 % 10 == 0 ) e += 2;
		cout << "+" << e << "+0";
		a -= e;
		b -= e;
		if( a < 0 ) cout << a / 2 << a / 2 << '+';
		else cout << '+' << a / 2 << '+' << a / 2 << '-';
		cout << "0";
		b /= 2;
		do
		{
			c = c * 10 + b % 10;
			b /= 10;
		}
		while( b );
		b = c;
		if( b < 0 ) cout << '+' << - b << b << '-';
		else cout << '-' << b << '+' << b << '+';
		cout << "0";
	}
	return 0;
}
posted @ 2024-01-25 16:51  liyilang2021  阅读(4)  评论(0编辑  收藏  举报