1 条题解

  • 0
    @ 2025-8-24 23:15:33

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar jinshengzhe
    **

    搬运于2025-08-24 23:15:33,当前版本为作者最后更新于2025-07-13 12:00:35,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    开始

    我们观察题目发现只需要用到 +-

    注意到

    k+k0k+k−0

    正着读为 pp 贡献 2k2k ,反着读对 qq 贡献 00

    相反 qq 的构造便是:

    0k+k0−k+k

    正着读为 pp 贡献 00,反着读对 qq 贡献 2k2k

    操作完后就可以得到以下代码:

        p /= 2;
    	q /= 2;
    	if (p > 0)
    		cout << p << "+" << p << "-0+";
    	else
    		cout << "0" << p << p << "+";
    	q = trans(q);
    	if (q > 0)
    		cout << "0-" << q << "+" << q << "+0";
    	else
    		cout << -q << q << "-0";
    

    根据上述结论,可以写出如下代码:

    #include <bits/stdc++.h>
    using namespace std;
    #define endl "\n";
    #define int long long
    
    int p, q;
    
    int trans(int x) {
    	int res = 0;
    	while (x)  {
    		res = res * 10 + x % 10;
    		x /= 10;
    	}
    	return res;
    }
    
    signed main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	cin >> p >> q;
    	if (p % 2 && q % 2) {
    		cout << "1+0+";
    		p--;
    		q--;
    	}
    	else if (q % 2) {
    		cout << "12+";
    		p -= 12;
    		q -= 21;
    	}
    	else if (p % 2) {
    		cout << "21+";
    		p -= 21;
    		q -= 12;
    	}
    	while (!(p % 10) || !(q % 10)) {
    		p -= 2;
    		q -= 2;
    		cout << "2+";
    	}
    	p /= 2;
    	q /= 2;
    	if (p > 0)
    		cout << p << "+" << p << "-0+";
    	else
    		cout << "0" << p << p << "+";
    	q = trans(q);
    	if (q > 0)
    		cout << "0-" << q << "+" << q << "+0";
    	else
    		cout << -q << q << "-0";
    	return 0;
    }
    

    注意一个魔鬼细节:

    	while (!(p % 10) || !(q % 10)) {
    		p -= 2;
    		q -= 2;
    		cout << "2+";
    	}
    

    不加这里会因为前导零错掉所以用 2+ 的方式构造出来。

    • 1

    信息

    ID
    12211
    时间
    3000ms
    内存
    1024MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者