Portal --> arc075_f

Solution

​   一开始抱着“我有信仰爆搜就可以过”的心态写了一个爆搜。。

​   但是因为。。剪枝和枚举方式不够优秀愉快T掉了qwq

​​   正解还是dp。。对我已经不会dp了qwq

​  

​​   首先我们可以写成一个熟悉的小学奥数形式:

​​   然后比较容易注意到,确定了\(e\)代表的数值,就确定了\(a\)代表的数值(中间的那堆方框是已知的东西就是\(D\))其他类似,也就是说我们可以对称着确定数值

​​   但是这里有一个东西比较的。。麻烦。。就是进位

​​   当然我们可以写一个爆搜暴力枚举一半然后中途剪枝通过进位之类的东西判断,但实际上注意到这个其实可以看成一个“两边向中间推进的过程”,根本没有必要爆搜,我们可以dp处理

​​   记\(f[i][j][k]\)表示,我们现在已经确定了前\(i\)位,第\(i+1\)位应该贡献给第\(i\)位的进位为\(j\),第\(n-i+1\)位应该贡献给\(n-i\)位的进位为\(k\),然后枚举范围的话就是\(i\in [1,\lfloor\frac{n}{2}\rfloor]\),\(j\)和\(k\)都\(\in \{0,1\}\)

​​   然后就直接枚举第\(i+1\)位上的数字,然后算出对称过去的数字,自然也就可以算出新的贡献出的进位,然后就直接转移就好了

​​   最后计算答案的时候,要分位数\(n\)为奇数或偶数两种情况讨论,主要就是因为。。如果是奇数的话中间会多一位,然后这位前后都不能有进位,偶数的话只要前后进位贡献相同就好了

​  

​​   代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=30;
int f[N][2][2],d[N];
int n,m,D;
ll ans;
void prework(int D){
d[0]=0;
while (D){
d[++d[0]]=D%10;
D/=10;
}
}
ll solve(int n1){
int n=n1/2,j1,k1,tmp,sum,mid;
ll ret=0;
for (int i=0;i<=n;++i)
for (int j=0;j<2;++j)
for (int k=0;k<2;++k)
f[i][j][k]=0;
f[0][0][0]=1;
for (int i=0;i<n;++i){
for (int j=0;j<2;++j)
for (int k=0;k<2;++k){
if (f[i][j][k]==0) continue;
for (int num=0;num<=9;++num){
sum=num+d[i+1]+k;
tmp=sum%10; k1=sum/10;
j1=(j*10+num)-(tmp+d[n1-i]);
if (j1<0||j1>1) continue;
if (!i&&(!num||!tmp)) continue;
f[i+1][j1][k1]+=f[i][j][k];
}
}
}
if (n1%2==1){
mid=(n1+1)/2;
for (int j=0;j<2;++j)
for (int k=0;k<2;++k){
if (!f[n][j][k]) continue;
for (int num=0;num<=9;++num){
sum=num+d[mid]+k;
if (sum%10==num&&sum/10==j)
ret+=f[n][j][k];
}
}
}
else
for (int j=0;j<2;++j)
ret+=f[n][j][j];
return ret;
} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
scanf("%d",&D);
prework(D);
for (int i=d[0];i<=d[0]*2;++i)
ans+=solve(i);
printf("%lld\n",ans);
}

【arc075F】Mirrored的更多相关文章

  1. 【ARC075F】Mirrored 搜索/数位dp

    Description ​ 给定正整数DD,求有多少个正整数NN,满足rev(N)=N+Drev(N)=N+D,其中rev(N)rev(N)表示将NN的十进制表示翻转来读得到的数 Input ​ 一个 ...

  2. 【arc075f】AtCoder Regular Contest 075 F - Mirrored

    题意 给定一个数x,问有多少个正整数y,使得rev(y)-y==x 其中rev(x)表示x按位翻转之后得到的数. x<=1e9 做法 首先通过打表发现,这个答案不会很大. 这就说明解相当地松弛. ...

  3. 【ARC075F】Mirror

    Description ​ 给定正整数\(D\),求有多少个正整数\(N\),满足\(rev(N)=N+D\). ​ 其中\(rev(N)\)表示将\(N\)的十进制表示翻转来读得到的数(翻转后忽略前 ...

  4. 【Linux】-NO.7.Linux.3.Maven.1.001-【CentOS 7 Install Maven 3.5】-

    1.0.0 Summary Tittle:[Linux]-NO.7.Linux.3.Maven.1.001-[CentOS 7 Install Maven 3.5]- Style:Linux Seri ...

  5. 【wpf】在win10系统上弹出toast和notification

    原文:[wpf]在win10系统上弹出toast和notification 老规矩,先看效果 右下角的notification: 操作中心的notification: 整体效果: 前提条件 1.需要在 ...

  6. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  7. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  8. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  9. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

随机推荐

  1. Linux 安装Zookeeper<准备>(使用Mac远程访问)

    阅读本文需要安装JDK 一 Zookeeper简介 zookeeper是用java语言编写的一款为分布式应用所设计的协调服务 zookeeper是apacahe hadoop的子项目 使用zookee ...

  2. [转]Git 撤销操作

    二. Git撤消操作 12.1 修改最后一次提交 git commit --amend 1.新建一个文件 2.提交一个之前的更改 3.跟踪这个文件 4.跟前一次一起提交 提示你是否重新编辑提交说明,如 ...

  3. [寒假学习笔记](二)Python初学

    Python 学习 python的自学从几个月前断断续续地进行,想好好利用这个寒假,好好地学一学. 回顾 已学习:基本操作.函数 已有C++的一定基础,只要注意python中比较特殊的部分就行 进入正 ...

  4. eclipse 简单操作

    1.设置字体: windows --> preferences --> general --> Colors and Fonts --> Basic --> 双击 Tex ...

  5. Pythagorean Triples毕达哥斯拉三角(数学思维+构造)

    Description Katya studies in a fifth grade. Recently her class studied right triangles and the Pytha ...

  6. GCD最大公约数

    说明: 最初跟鹏哥学习最大公约数的算法是辗转相除,确实印象很深刻,那种辗转赋值的思想在好多题目中都有运用,但随着进一步学习,我也参考了其他几种方便快捷的最大公约数求法,在这里做一个总结. . int ...

  7. Python:模块学习——sys模块

    sys模块常见函数和变量 sys.argv:命令行参数,实现从程序外部向程序传递参数 [注]:(1) sys.argv[0] 表示代码本身的文件路径 (2)sys.argv是一个元组,可以用[ ]提取 ...

  8. 2018软工实践—Alpha冲刺(9)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 多次测试软件运行 学习OPENMP ...

  9. WPF和Expression Blend开发实例:模拟QQ登陆界面打开和关闭特效

    不管在消费者的心中腾讯是一个怎么样的模仿者抄袭者的形象,但是腾讯在软件交互上的设计一直是一流的.正如某位已故的知名产品经理所说的:设计并非外观怎样,感觉如何.设计的是产品的工作原理.我觉得腾讯掌握了其 ...

  10. Java实现的词频统计——功能改进

    本次改进是在原有功能需求及代码基础上额外做的修改,保证了原有的基础需求之外添加了新需求的功能. 功能: 1. 小文件输入——从控制台由用户输入到文件中,再对文件进行统计: 2.支持命令行输入英文作品的 ...