Codeforces Round 802 (Div. 2)

发布时间 2023-12-10 16:42:12作者: 加固文明幻景

基本情况

A题秒了。

B题经典+4。

C题没想法(大概想了半小时)。

B. Palindromic Numbers

Problem - B - Codeforces

起步

首先很明显是高精。

然后要求加上的数字位数和给的位数相同。

答案不限制,只要回文就行。

第一思路就是口胡几个万能的回文答案。

  • 给定的数的第一位比 \(9\)

    • 显然,把每一位都覆上 \(9\) 可以完成这个情景。

    • for (int i = 0; i < a.len; i++) tb[i] = '9';
      
  • 给定的数的第一位就是 \(9\)

    • 明显要口胡一个多一位的回文数。

    • 然后一开始我就真纯口胡了。

      if (a.str()[0] == '9')
      	{
      		int bn = a.len + 1;
      		if (bn & 1)
      		{
      			for (int i = 0; i < bn >> 1; i++)
      			{
      				tb[i] = cnt++;		
      			}
      			for (int i = bn >> 1; i < bn; i++)
      			{
      				tb[i] = cnt--;
      			}
      		}
      		else
      		{
      			for (int i = 0; i < bn >> 1; i++)
      			{
      				tb[i] = cnt++;		
      			}
      			cnt--;
      			for (int i = bn >> 1; i < bn; i++)
      			{
      				tb[i] = cnt--;
      			}
      		}
      	}
      
    • 大概就是搞一个12321这类的回文串,然而这有可能是错的啊啊

改错

幸好是发现了上面那个问题。

比如 \(n = 18\)

那么我口胡的串就是 \(1234567891011...\)

你要不看看自己在说什么。。。

一位放两位了都开始。

所以为啥不找一个和 \(999\) 一样通用的呢

\(n = 3\) 来分析:

考虑 \(a\ge 900\) 时,我们发现:

  • 只有当 \(a+b-900<1000\)\(a+b\) 减去最小的 \(a\) 不能超过 \(n\) 位数)
  • \(a+b-999\ge100\)\(a+b\) 减去最大的 \(a\) 不能不到 \(n\) 位数)
  • 随便移个项就能得到 \(1099\le a+b<1900\)
  • 在这个范围里随便拎个回文数出来(比如 \(1111\))就行了。

代码

大整数类就不复制过来了,太长了。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>

using namespace std;

char tb[100010];

void solve()
{
	int n;
	memset(tb, '\0', sizeof(tb));
	Big_integer a = Big_integer();
	cin >> n >> a;
	if (a.str()[0] == '9')
		for (int i = 0 ; i < a.len + 1; i++) tb[i] = '1';
	else
		for (int i = 0; i < a.len; i++) tb[i] = '9';
	Big_integer b = Big_integer(tb);
	cout << b - a << endl;
}

int main()
{
	int _; std::cin >> _;
	while(_--) solve();
	return 0;
}

C. Helping the Nature

Problem - C - Codeforces

要用差分,带我学学。