AT4828 [ABC152D] Handstand 2 题解

PosVII

2021-06-23 13:58:03

Solution

**前言** ------------ 赛时想到正解,打了一个小时还错了……我的方法和其他人的不太一样,思考难度蓝题(提高+/省选-)吧。 **思路** ------------ 我们把这道题看作一个递推。那么每次 $n$ 加一时,我们可以多做出 $([1,n-1],n)+(n,[1,n-1])+(n,n)$ 个选择。 因为 $(x,y)=(y,x)$ 那么我们可以化简式子得: 每次 $n$ 加一时,我们可以多做出 $2\times([1,n-1],n)+(n,n)$ 个选择。 但是,这么搜索只能得 $48$ 分,所以我们要对这个式子进行优化。 **优化** ------------ 每一次的 $n$ 是一定的,那么对于 $(n,x)$ 可行的 $x$ 来说,它的首位和末位被确定了,所以对于 $x$ 而言,它要满足如下表的形式。 设 $n$ 的首位和末位为 $h$ 和 $b$,而 $n$ 和 $x$ 的长度为 $lenn$ 和 $lenx$ 当 $lenx=lenn$ 且 $b<h$ 时: $x=\overline{bm(lenm=lenx-2)h}$ ,$(n,x)=10^{lenx-2}$ 当 $lenx=lenn$ 且 $b=h$ 时: $x=\overline{bm(lenm=lenx-2,m\leq \frac{(n \mod 10^{lenn})}{10})h}$ ,$(n,x)=\frac{(n \mod 10^{lenn})}{10}$ 当 $lenx<lenn$ 且 $lenx\geq 3$ 时: $x=\overline{bm(lenm=lenx-2)h}$ ,$(n,x)=10^{lenx-2}$ 当 $lenx\geq 3$ 且 $b=h$ 时: $x=\overline{bh}$ ,$(n,x)=1$ 这下所有的情况都列出来了,我们可以发现 $3 \geq lenx \geq lenn-1$ 时,$(n,x)$ 可以直接求出,那么其它的情况也可以特判得到。 当然,记得将每一次得到的 $(n,x)$ 的数量乘二,因为有 $(x,n)$,同时也要判重减一,因为有 $(n,n)$。 最后,如果 $b=0$ 时,$x$ 是不存在的! **code** ------------ ``` #include<bits/stdc++.h> using namespace std; long long sum=9,n,las,len; long long l[10]={1,10,100,1000,10000,100000,1000000}; long long suml[10]={1,11,111,1111,11111,111111,1111111}; int main() { // freopen("handstand.in","r",stdin); // freopen("handstand2.out","w",stdout); cin>>n; if(n<=9) { cout<<n; return 0; } for(int i=10;i<=n;i++) { las=0; if(l[len]<=i) len++; if(i/l[len-1]>i%10&&i%10!=0) { las+=suml[len-2]; } else if(len>=3&&i%10!=0) las+=suml[len-3]; las*=2; if(i/l[len-1]==i%10) { las+=((i%l[len-1])/10+1)*2+1; } sum+=las; } cout<<sum; return 0; } ``` **总结** ------------ 此题比较简单,但是一旦错了真的要你调半天。