// 多校5 HDU5787 K-wolf Number 数位DP
// dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d
// f 用作标记,当现在枚举的数小于之前的数时,就不用判断i与dig[pos]的大小
// 整体来说就,按位往后移动,每次添加后形成的数都小于之前的数,并且相邻k位不一样,一直深搜到cnt位
// http://blog.csdn.net/weizhuwyzc000/article/details/52097690 // #pragma comment(linker, "/STACK:102c000000,102c000000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <string>
#include <algorithm>
#include <list>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
// #include <conio.h>
using namespace std;
#define clc(a,b) memset(a,b,sizeof(a))
const double inf = 0x3f3f3f3f;
#define lson l,mid,rt<<1
// #define rson mid+1,r,rt<<1|1
const int N = ;
const int M = 1e6+;
const int MOD = 1e9+;
#define LL long long
#define LB long double
// #define mi() (l+r)>>1
double const pi = acos(-);
const double eps = 1e-;
void fre(){freopen("in.txt","r",stdin);}
void freout(){freopen("out.txt","w",stdout);}
inline int read(){int x=,f=;char ch=getchar();while(ch>''||ch<'') {if(ch=='-') f=-;ch=getchar();}while(ch>=''&&ch<='') { x=x*+ch-'';ch=getchar();}return x*f;} LL l,r,cnt;
int k;
int dig[];
LL dp[][][][][][];
int vis[][][][][][];
int cas;
LL dfs(LL pos,int a,int b,int c,int d,int f){
if(pos==cnt) return 1LL;
if(vis[pos][a][b][c][d][f]==cas) return dp[pos][a][b][c][d][f];
vis[pos][a][b][c][d][f]=cas;
LL ans=;
if(f){
for(int i=;i<;i++){
if(k==) {if(d==i) continue;}
else if(k==) {if(d==i||c==i) continue;}
else if(k==) {if(d==i||c==i||b==i) continue;}
else {if(d==i||c==i||b==i||a==i) continue;}
if(i==){
if(d==) ans+=dfs(pos+,a,b,c,d,f);
else ans+=dfs(pos+,b,c,d,i,f);
}
else ans+=dfs(pos+,b,c,d,i,f);
}
}
else{
for(int i=;i<;i++){
if(k==) {if(d==i) continue;}
else if(k==) {if(d==i||c==i) continue;}
else if(k==) {if(d==i||c==i||b==i) continue;}
else {if(d==i||c==i||b==i||a==i) continue;}
if(i<dig[pos]){
if(i==){
if(d==) ans+=dfs(pos+,a,b,c,d,);
else ans+=dfs(pos+,b,c,d,i,);
}
else ans+=dfs(pos+,b,c,d,i,);
}
else if(i==dig[pos]){
if(i==){
if(d==) ans+=dfs(pos+,a,b,c,d,f);
else ans+=dfs(pos+,b,c,d,i,f);
}
else
ans+=dfs(pos+,b,c,d,i,f);
}
}
}
return dp[pos][a][b][c][d][f]=ans;
} bool ck(){
for(int i=;i<cnt;i++){
for(int j=i-;j>=max(,i-k+);j--){
if(dig[i]==dig[j]) return false;
}
}
return true;
}
int tem[];
int main(){
while(~scanf("%I64d%I64d%d",&l,&r,&k)){
cnt=;
while(r) tem[cnt++]=r%,r=r/;
int k=;
for(int i=cnt-;i>=;i--) dig[k++]=tem[i];
cas++;
LL ans1=dfs(,,,,,);
cnt=,k=;
while(l) tem[cnt++]=l%,l=l/; for(int i=cnt-;i>=;i--) dig[k++]=tem[i];
cas++;
LL ans2=dfs(,,,,,);
if(ck()) ans2--;
printf("%I64d\n",ans1-ans2);
}
return ;
}

多校5 HDU5787 K-wolf Number 数位DP的更多相关文章

  1. HDU5787 K-wolf Number 数位dp

    分析:赛场上也知道是裸的数位dp,但是无奈刷数位dp题刷的太少了,并不能写出来 一点感想:赛后补题,看了题解的map记录状态,一脸蒙逼,也是非常的不爽,然后想看别人写的,不是递归就是写的比较乱 而且我 ...

  2. codeforces Hill Number 数位dp

    http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits: ...

  3. HDU 5787 K-wolf Number 数位DP

    K-wolf Number Problem Description   Alice thinks an integer x is a K-wolf number, if every K adjacen ...

  4. HDU 3709 Balanced Number (数位DP)

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  5. beautiful number 数位DP codeforces 55D

    题目链接: http://codeforces.com/problemset/problem/55/D 数位DP 题目描述: 一个数能被它每位上的数字整除(0除外),那么它就是beautiful nu ...

  6. hdu 5898 odd-even number 数位DP

    传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...

  7. Fzu2109 Mountain Number 数位dp

    Accept: 189    Submit: 461Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description One ...

  8. hdu_3565_Bi-peak Number(数位DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3565 题意:给你一个区间,让你找这个区间内有两个山峰的数的最大和,什么是两个山峰,比如121121   ...

  9. HDU 5179 beautiful number 数位dp

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...

随机推荐

  1. SSL/TLS/WTLS原理

    一 前言 首先要澄清一下名字的混淆:1 SSL(Secure Socket Layer)是netscape公司设计的主要用于web的安全传输协议.这种协议在WEB上获得了广泛的应用.2 IETF(ww ...

  2. PCB走线角度选择 — PCB Layout 跳坑指南

    现在但凡打开SoC原厂的PCB Layout Guide,都会提及到高速信号的走线的拐角角度问题,都会说高速信号不要以直角走线,要以45度角走线,并且会说走圆弧会比45度拐角更好.狮屎是不是这样?PC ...

  3. arcengine C# 读写lyr(转)

    写lyr { IFeatureLayer LineLayer = axMapControl1.get_Layer(0) as IFeatureLayer;            ILayerFile ...

  4. 转 Difference between WCF and Web API and WCF REST and Web Service

    http://www.dotnet-tricks.com/Tutorial/webapi/JI2X050413-Difference-between-WCF-and-Web-API-and-WCF-R ...

  5. JS模块化编程

    AMD:异步模块定义,适合客户端环境,不会阻塞运行.客户端受网络影响比较大. CommonJs:适用于服务器端规范,可以同步加载,只受硬盘读写的影响.

  6. PCA understanding

    PCA understanding 我们希望获取玩具的位置,事实上我们只需要知道玩具在x轴的位置就可以了(但现实不知道).我们利用三个坐标轴,获取了2*3维度的数据,现实中我们如何通过分析六维度数据来 ...

  7. Java连接MySQL数据库及简单操作代码

    1.Java连接MySQL数据库 Java连接MySql需要下载JDBC驱动MySQL-connector-java-5.0.5.zip(举例,现有新版本).然后将其解压缩到任一目录.我是解压到D盘, ...

  8. C++STL 之排列

    固然我们可以自己使用递归编写全排列程序,但是既然STL里面已将有了这个功能为什么不直接用呢,下面就写一下直接使用C++ STL生成全排序的程序 函数名:next_permutation 包含头文件:a ...

  9. git版本库底层命令

    当我们在使用git的时候,有时候需要知道当前文件夹相对于工作目录根目录的相对路径等等,那么我们可以使用 git rev-parse 添加一个参数就可以实现,如: 显示当前仓库版本库 .git 目录所在 ...

  10. 8天学通MongoDB——第四天 索引操作

    这些天项目改版,时间比较紧,博客也就没跟得上,还望大家见谅. 好,今天分享下mongodb中关于索引的基本操作,我们日常做开发都避免不了要对程序进行性能优化,而程序的操作无非就是CURD,通常我们 又 ...