// 多校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. HTML5 文件API(二)

    1.FileSystem概述及浏览器检 2.申请磁盘配额 3.创建文件

  2. SQLite数据插入异常

    对比两条SQL语句 1.insert into MemberInfo(MTypeId,MName,MPhone,MMoney,MIsDelete) values(@tid,@name,@phone,@ ...

  3. Python数字加千分符

    1.最简单的内置format函数: >>> format(1234567890,',') '1,234,567,890' 2.正则表达式: import re def formatN ...

  4. android自动更新软件版本

    根据网上的然后小改 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import j ...

  5. android系统中使用TelephonyManager类来获取imei号和其他手机信息

    在AndroidManifest.xml文件中增加<!--允许读取电话状态SIM的权限--><uses-permission android:name="android.p ...

  6. ios摇一摇

    -(void) motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { if (motion==UIEventSubtypeMo ...

  7. Android开发之XML的创建和解析

    参考:http://blog.csdn.net/pi9nc/article/details/9320413 XML文件的解析,代码: public void click(View v) { Input ...

  8. super.getClass()方法

    下面程序的输出结果是多少? importjava.util.Date; public class Test extends Date{ public static void main(String[] ...

  9. textview设置字体的行距和字间距

    字间距 textView有一个属性android:textScaleX是调节字间距的,它的值是一个float型.查看源代码,默认textView 此属性是使用的是: android.internal. ...

  10. 如何在Asp.Net WebApi接口中,验证请求参数中是否携带token标识!

    [BasicAuthentication] public abstract class ApiControllerBase : ApiController { #region Gloal Proper ...