【ARC075F】Mirrored 搜索/数位dp
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的更多相关文章
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- 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 ...
- hdu_3562_B-number(记忆化搜索|数位DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3652 题意:给你一个n,为比n小的能整除13并数字中有13的数有多少个 题解:记忆化搜索:记dp[i] ...
- 【记忆化搜索/数位DP】zznu2175(长度为n的含有ACM的字符串)
随机字符串 题目描述 起名字什么的最麻烦,我们来生成一些随机字符串吧 生成的字符串当然是有要求的: .长度不能超过n .字符串中仅包含大写字母 .生成的字符串必须包含字符串“ACM” ok,是不是很简 ...
- 数位DP HDU3652
B-number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- Hdu 3652 B-number (同余数位DP)
题目链接: Hdu 3652 B-number 题目描述: 给出一个数n,问 [1, n]区间内有几个数能被13整除并且还有13这个子串? 解题思路: 能整除的数位DP,确定好状态随便搞搞就能过了.d ...
- 数位dp/记忆化搜索
一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an ...
- [hihocoder 1033]交错和 数位dp/记忆化搜索
#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...
- luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索
题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...
随机推荐
- DRF之权限认证频率组件
概要 retrieve方法源码剖析 认证组件的使用方式及源码剖析 权限组件的使用方式及源码剖析 频率组件的使用方式及源码剖析 知识点复习回顾 Python逻辑运算 知识点复习回顾一:Python逻辑运 ...
- PyInstaller打包成exe可执行文件
PyInstaller 安装pyinstaller 对于那些网络比较稳定,能够流畅使用pip源地址的用户,直接下面的命令就可以搞定: pip install pyinstaller 通常我们会下载源码 ...
- MobileSubstrate
[MobileSubstrate] Cydia Substrate (formerly called MobileSubstrate) is the de facto framework that a ...
- 用户“*****”不具有所需的权限。请验证授予了足够的权限并且解决了 Windows 用户帐户控制(UAC)限制问题。
错误: 用户“ts\***”不具有所需的权限.请验证授予了足够的权限并且解决了 Windows 用户帐户控制(UAC)限制问题. 解决: 当从客户端用IE连接http://xxx.xxx.xxx.xx ...
- ionic中的后退方法
1)$ionicHistory.goBack(); 2)$ionicNavBarDelegate.back(); 个人感觉: 1)$ionicHistory.goBack()会按照html历史来后退 ...
- 如何查询centos、Debian服务器、查看系统内核版本,系统版本,32位还是64位
查看centos内核的版本: 1)[root@localhost ~]# cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@build ...
- box-shadow 内阴影
1.盒子阴影样式单词:box-shadow 2.语法 代表边框间距靠左0 靠上0 和1px阴影范围 阴影颜色为黑色(#000),有inset 代表框内阴影 ,不带inset 代表框外阴影. 注意:bo ...
- AlphaPose ubuntu16 python2安装
#https://www.tensorflow.org/install/install_linux#ValidateYourInstallation #https://github.com/MVIG- ...
- 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 ...
- c# 常规验证基类
using System;using System.Collections.Generic;using System.Linq;using System.Text.RegularExpressions ...