题解 AT2582 [ARC075D] Mirrored

题意:给定 D,求满足 rev(N)=N+DN 的个数,rev(N) 表示十进制下将 N 按位翻转并去掉前导 0 后的数。

为了更清楚地表示,我们设 |N|N 的位数。

由于是将 N 翻转,我们直接将翻转前后的位置匹配算贡献。可以直接枚举 |N|,枚举每对的 高位减低位 的差,就能算出 rev(N)N 的值,如果 =D 将方案数计入答案即可。注意一些限制条件即可。这样的复杂度是 19|N|+12。而这样就算我们吸氧,|N| 也只能枚举到 14,会 WA 4 个点。而 |N| 却是理论上 18 的,可以自己证一下。

由于我们写的是搜索,自然可以想想怎么剪枝。我们发现每对的贡献都形如 999000×c,其中 c 为高位减低位的差。更加具体地,如果当前高位距离最高位有 k 个数位,贡献为 (10|N|2×k1)×10k。如果自己手推几个长度就能发现,由低到高贡献的跨度比每次 ×10 还要大。这也就有一个问题:我们枚举匹配出的对时,按贡献从高到低枚举,偏差很难由低位补足。也就是说,满足条件的差的序列很少。这时可行性剪枝效果非常出色。我们只需要在上述做法加一个可行性剪枝即可无压力通过。

Code

int d; ll pw[20]; ll to[20][15]; ll suf[20][15]; ll dfs(int all, int nw, ll sum, ll res) { if(sum + suf[all][nw] < d || sum - suf[all][nw] > d) return 0; if(nw == (all >> 1)) { if(abs(d - sum) % (pw[all - nw] - pw[nw - 1]) || abs(d - sum) / (pw[all - nw] - pw[nw - 1]) > 9) return 0; int nd = (d - sum) / (pw[all - nw] - pw[nw - 1]); return res * (10 - abs(nd) - (nw == 1)); } ll ret = 0; rep(i, -9, 9) { if(nw == 1 && i == -9) continue; ll nwp = (pw[all - nw] - pw[nw - 1]) * i; ret += dfs(all, nw + 1, sum + nwp, res * (10 - abs(i) - (nw == 1))); } return ret; } int main() { pw[0] = 1; rep(i, 1, 18) pw[i] = pw[i - 1] * 10; rep(i, 2, 18) rep(j, 1, (i >> 1)) to[i][j] = pw[i - j] - pw[j - 1]; rep(i, 2, 18) per(j, (i >> 1), 1) suf[i][j] = suf[i][j + 1] + to[i][j] * 9; qread(d); ll ans = 0; rep(i, 2, 18) { if(i & 1) ans += 10 * dfs(i, 1, 0, 1); else ans += dfs(i, 1, 0, 1); } cout << ans << endl; return 0; }

__EOF__

本文作者BreezeEnder
本文链接https://www.cnblogs.com/BreezeEnder/p/15780351.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   BreezeEnder  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)
点击右上角即可分享
微信分享提示