基本情况
A题秒了。
B题经典+4。
C题没想法(大概想了半小时)。
B. Palindromic Numbers
起步
首先很明显是高精。
然后要求加上的数字位数和给的位数相同。
答案不限制,只要回文就行。
第一思路就是口胡几个万能的回文答案。
-
给定的数的第一位比 \(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
要用差分,带我学学。