Description

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

Input

​ 一个正整数DD

Output

​ 满足上述条件的正整数的个数

Sample Input

Case 1:
63 Case 2:
75 Case 3:
864197532

Sample Output

Case 1:
2 Case 2:
0 Case 3:
1920

HINT

​ 1≤D≤1091≤D≤109

​ 样例1解释:81=18+63,92=29+63

Sol

我们把题目转化成rev(n)-n=d,然后折半搜索,只搜一半,另一半可以直接计算,这样的复杂度为\(O(2^{18})\)左右。

然而还是有更强的做法的,这个不用搜。。可以dp。。而且复杂度只有\(O(d^2*10)\),具体地,在这里:orzDTZ,写得非常详细。

Code

搜索:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int D,cnt[19],ans;ll b[20];
void dfs(int x,ll res,int L,int now)
{
if(x>(L>>1)-1){if(res==D) ans+=now*(L&1?10:1);return;}
ll i=-9ll;while(i<9ll&&res+(i+1ll)*(b[L-x-1]-b[x])<=D) ++i;
dfs(x+1,res+i*(b[L-x-1]-b[x]),L,now*(x==0&&i>=0?cnt[i+9]-1:cnt[i+9]));
if(++i<=9) dfs(x+1,res+i*(b[L-x-1]-b[x]),L,now*(x==0&&i>=0?cnt[i+9]-1:cnt[i+9]));
}
int main()
{
scanf("%d",&D);
b[0]=1ll;for(int i=1;i<19;++i) b[i]=b[i-1]*10ll;
for(int i=0;i<=9;++i) for(int j=0;j<=9;++j) ++cnt[i-j+9];
for(int i=1;i<=18;++i) dfs(0,0,i,1);
printf("%d",ans);
}

dp:

#include <bits/stdc++.h>
using namespace std;
int d[10005],f[10005][2][2],L,ans,lim,P=1e9+7;char D[10005];
int dp(int n)
{
int m=n>>1,res=0;
for(int i=0;i<=m;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<m;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) if(f[i][j][k]) for(int x=0,y,j1,k1;x<10;x++)
{
k1=x+d[i+1]+k,y=k1%10,k1/=10,j1=10*j+x-y-d[n-i];
if(j1<0||j1>1||(!i&&(!x||!y))) continue;
(f[i+1][j1][k1]+=f[i][j][k])%=P;
}
if(n&1) for(int j=0,mid=(n+1)>>1;j<2;j++) for(int k=0;k<2;k++) if(f[m][j][k]) for(int x=0,y;x<10;x++)
{
y=x+d[mid]+k;
if((x==y%10)&&(y/10==j)) (res+=f[m][j][k])%=P;
}
if(!(n&1)) for(int j=0;j<2;j++) (res+=f[m][j][j])%=P;
return res;
}
int main()
{
scanf("%s",D+1);L=strlen(D+1);lim=L<<1;
for(int i=1;i<=L;i++) d[L-i+1]=D[i]-'0';
for(int i=max(2,L);i<=lim;i++) (ans+=dp(i))%=P;
printf("%d\n",(ans+P)%P);
}

【ARC075F】Mirrored 搜索/数位dp的更多相关文章

  1. hdu3555 Bomb (记忆化搜索 数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  2. UVALive 4864 Bit Counting --记忆化搜索 / 数位DP?

    题目链接: 题目链接 题意:如果一个数二进制n有k位1,那么f1[n] = k,如果k有s位二进制1,那么f2[n] = f1[k] = s.  如此往复,直到fx[n] = 1,此时的x就是n的”K ...

  3. hdu_3562_B-number(记忆化搜索|数位DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3652 题意:给你一个n,为比n小的能整除13并数字中有13的数有多少个 题解:记忆化搜索:记dp[i] ...

  4. 【记忆化搜索/数位DP】zznu2175(长度为n的含有ACM的字符串)

    随机字符串 题目描述 起名字什么的最麻烦,我们来生成一些随机字符串吧 生成的字符串当然是有要求的: .长度不能超过n .字符串中仅包含大写字母 .生成的字符串必须包含字符串“ACM” ok,是不是很简 ...

  5. 数位DP HDU3652

    B-number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  6. Hdu 3652 B-number (同余数位DP)

    题目链接: Hdu 3652 B-number 题目描述: 给出一个数n,问 [1, n]区间内有几个数能被13整除并且还有13这个子串? 解题思路: 能整除的数位DP,确定好状态随便搞搞就能过了.d ...

  7. 数位dp/记忆化搜索

    一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an  ...

  8. [hihocoder 1033]交错和 数位dp/记忆化搜索

    #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...

  9. luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索

    题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...

随机推荐

  1. DRF之权限认证频率组件

    概要 retrieve方法源码剖析 认证组件的使用方式及源码剖析 权限组件的使用方式及源码剖析 频率组件的使用方式及源码剖析 知识点复习回顾 Python逻辑运算 知识点复习回顾一:Python逻辑运 ...

  2. PyInstaller打包成exe可执行文件

    PyInstaller 安装pyinstaller 对于那些网络比较稳定,能够流畅使用pip源地址的用户,直接下面的命令就可以搞定: pip install pyinstaller 通常我们会下载源码 ...

  3. MobileSubstrate

    [MobileSubstrate] Cydia Substrate (formerly called MobileSubstrate) is the de facto framework that a ...

  4. 用户“*****”不具有所需的权限。请验证授予了足够的权限并且解决了 Windows 用户帐户控制(UAC)限制问题。

    错误: 用户“ts\***”不具有所需的权限.请验证授予了足够的权限并且解决了 Windows 用户帐户控制(UAC)限制问题. 解决: 当从客户端用IE连接http://xxx.xxx.xxx.xx ...

  5. ionic中的后退方法

    1)$ionicHistory.goBack(); 2)$ionicNavBarDelegate.back(); 个人感觉: 1)$ionicHistory.goBack()会按照html历史来后退 ...

  6. 如何查询centos、Debian服务器、查看系统内核版本,系统版本,32位还是64位

    查看centos内核的版本: 1)[root@localhost ~]# cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@build ...

  7. box-shadow 内阴影

    1.盒子阴影样式单词:box-shadow 2.语法 代表边框间距靠左0 靠上0 和1px阴影范围 阴影颜色为黑色(#000),有inset 代表框内阴影 ,不带inset 代表框外阴影. 注意:bo ...

  8. AlphaPose ubuntu16 python2安装

    #https://www.tensorflow.org/install/install_linux#ValidateYourInstallation #https://github.com/MVIG- ...

  9. jQuery基础教程-第8章-001Adding new global functions

    一. 1.To add a function to the jQuery namespace, we can just assign the new function asa property of ...

  10. c# 常规验证基类

    using System;using System.Collections.Generic;using System.Linq;using System.Text.RegularExpressions ...