【arc075F】Mirrored
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的更多相关文章
- 【ARC075F】Mirrored 搜索/数位dp
Description 给定正整数DD,求有多少个正整数NN,满足rev(N)=N+Drev(N)=N+D,其中rev(N)rev(N)表示将NN的十进制表示翻转来读得到的数 Input 一个 ...
- 【arc075f】AtCoder Regular Contest 075 F - Mirrored
题意 给定一个数x,问有多少个正整数y,使得rev(y)-y==x 其中rev(x)表示x按位翻转之后得到的数. x<=1e9 做法 首先通过打表发现,这个答案不会很大. 这就说明解相当地松弛. ...
- 【ARC075F】Mirror
Description 给定正整数\(D\),求有多少个正整数\(N\),满足\(rev(N)=N+D\). 其中\(rev(N)\)表示将\(N\)的十进制表示翻转来读得到的数(翻转后忽略前 ...
- 【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 ...
- 【wpf】在win10系统上弹出toast和notification
原文:[wpf]在win10系统上弹出toast和notification 老规矩,先看效果 右下角的notification: 操作中心的notification: 整体效果: 前提条件 1.需要在 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
随机推荐
- VS2013只显示会附加到进程,无法启动调试
今天在使用VS2013的时候,打开突然发现,只显示附加到进程,无法进行调试,调试位置显示灰色,到网上各处寻求答案,本以为是个大问题,没想到只是个小问题.主要原因只是后台开太多东西了,导致VS2013运 ...
- JY播放器【喜马拉雅FM电脑端,附带下载功能】
今天给大家带来一款神器----JY播放器.可以不用打开网页就在电脑端听喜马拉雅FM的节目,而且可以直接下载,对于我这种强迫症患者来说真的是神器.我是真的不喜欢电脑任务栏上面密密麻麻的. 目前已经支持平 ...
- Laya 自适应 不拉伸处理
Laya.init(640, Laya.Browser.width / 640 * 1028, WebGL); Laya.stage.scaleMode = "fixedwidth" ...
- HDU 6438
Problem Description The Power Cube is used as a stash of Exotic Power. There are n cities numbered 1 ...
- python—退出ipython3的help()
退出ipython3的help() 组合键:ctrl+z
- Halcon算子解释
Halcon算子解释大全 Halcon/Visionpro视频教程和资料,请访问 重码网,网址: http://www.211code.com Chapter 1 :Classification 1. ...
- USACO 3.3.1 Riding the Fences 骑马修栅栏(欧拉回路)
Description 农民John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个一个栅栏.你必须编一个程 ...
- tensorflow训练线性回归模型
tensorflow安装 tensorflow安装过程不是很顺利,在这里记录一下 环境:Ubuntu 安装 sudo pip install tensorflow 如果出现错误 Could not f ...
- 使用git提交代码的一些小心得
1.不进行push不能运行的代码,如果需要提交,可以先注释,保证其他人pull时,可以得到能够正常使用的代码 2.每做完一件事,写一条描述,一次提交.不要等写了一堆代码,然后写一堆描述,这样如果需要查 ...
- rsa加密算法,前后端实现。
前端js: 下载地址:http://travistidwell.com/jsencrypt/ js第一版本: // 对数据加密 function encrypt(enStr){ //没有加载jsenc ...