最近正在练构造题,写篇题解分享一下实现的细节。
核心过程
大胆猜测,不难发现一个重要的结论:假设有一个式子 \(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;
}
标签:输出,奇数,long,偶数,CF1912E,include
From: https://www.cnblogs.com/-lilong-/p/17987535