hdu 5787 K-wolf Number(数位dp)
来源:互联网 发布:动态效果软件 编辑:程序博客网 时间:2024/05/16 17:44
K-wolf Number
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 807 Accepted Submission(s): 300
Problem Description
Alice thinks an integer x is a K-wolf number, if every K adjacent digits in decimal representation of x is pairwised different.
Given (L,R,K), please count how many K-wolf numbers in range of [L,R].
Given (L,R,K), please count how many K-wolf numbers in range of [L,R].
Input
The input contains multiple test cases. There are about 10 test cases.
Each test case contains three integers L, R and K.
1≤L≤R≤1e18
2≤K≤5
Each test case contains three integers L, R and K.
Output
For each test case output a line contains an integer.
Sample Input
1 1 220 100 5
Sample Output
172
Author
ZSTU
Source
2016 Multi-University Training Contest 5
【分析】很明显的数位dp,我们可以枚举前k-1位数字,作为我们保存的状态,然后套数位dp。(注意前导0的情况)
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<map>#include<set>#include<vector>#define F first#define S second#define mp make_pairusing namespace std;typedef __int64 LL;LL digit[100],dp[20][100010],k;//对于为什么存五位,有点bug,还没解决。
bool judge(LL d,LL s){ int x=k-1; while(x--) { if(d==(s%10)) return false; s/=10; } return true;}const int ten[] = {1, 10, 100, 1000, 10000, 100000};LL get(LL d,LL s,bool first){ if(first&&!d) return 0; if(!first) {// LL sum=1;// for(int i=0; i<k-2; i++) sum*=10;// cout<<sum<<" "<<s<<endl;// while(s>=sum) s-=sum;// cout<<s<<endl; return (s*10+d)%ten[k]; } else { LL sum=0; for(int i=0; i<k-1; i++) { sum=sum*10+d; } return sum; }}LL dfs(LL cnt,LL s,bool e,bool first)//first 用来标记前导0{ if(!cnt) return 1LL; if(!e && ~dp[cnt][s]) return dp[cnt][s]; LL ret=0; LL to=e?digit[cnt]:9; for(LL d=0; d<=to; d++) { if(!judge(d,s)&&!first) { continue; } LL as=get(d,s,first); ret+=dfs(cnt-1,as,e&&d==to,first&&!d); } if(!e) dp[cnt][s]=ret; return ret;}LL calc(LL x){ memset(dp, -1, sizeof(dp)); LL cnt = 0; while(x) digit[++cnt] = x % 10, x /= 10; return dfs(cnt, 0, 1, 1);}//bool judge1(int x, int k)//{// int cnt = 0;// for(; x; x /= 10) digit[++cnt] = x % 10;//// for(int i = 1; i <= cnt; ++i)// {// bool ok = true;// for(int j = 1; j < k; ++j)// {// if(i - j >= 1 && digit[i] == digit[i - j])// {// ok = false;// break;// }// }// if(!ok) return false;// }// return true;//}//int sum[1000005];int main(){// for(k = 1; k <= 5; ++k)// {// for(int i = 1; i <= 100000; ++i)// {// sum[i] = sum[i - 1] + judge1(i, k);// if(sum[i] + 1!= calc(i))// {// printf("%d: %d %d %d\n", i, sum[i] + 1, calc(i), k);// printf("WA\n");// break;// }// }// } LL l,r; while(~scanf("%I64d%I64d%I64d",&l,&r,&k)) { printf("%I64d\n",calc(r)-calc(l-1)); } return 0;}
0 0
- HDU - 5787 K-wolf Number 数位DP
- Hdu-5787 K-wolf Number(数位DP)
- hdu-5787-K-wolf Number-数位DP
- HDU 5787 K-wolf Number 数位dp
- hdu-5787-K-wolf Number-数位DP
- HDU 5787 K-wolf Number (数位DP)
- HDU-5787 K-wolf Number(数位DP)
- HDU 5787 K-wolf Number(数位DP)
- 【HDU 5787】K-wolf Number(数位DP)
- hdu 5787 K-wolf Number (数位DP )
- hdu 5787 K-wolf Number(数位dp)
- HDU 5787 K-wolf Number(数位DP)
- HDOJ 5787 K-wolf Number 数位DP
- HDU 5787 wolf Number 数位dp
- HDU5787 K-wolf Number(数位DP)
- hdu5787 K-wolf Number【数位dp】
- HDU 5787 K-wolf Number
- HDU 5787 K-wolf Number
- 二叉搜索树的那点事儿
- Codeforces Round #365 (Div. 2)
- Android学习笔记之AndroidManifest.xml文件解析
- list - 内建函数
- 教你怎么把pdf文件转换成word文档
- hdu 5787 K-wolf Number(数位dp)
- Android经典的大牛博客推荐
- H5学习之22 CSS-导航栏的创建
- SharedPreferences 的工具类
- 分类算法—决策树
- Dubbo实战教程
- Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xm
- Windows下通过命令行编译C/C++程序
- 【zzuliOJ】1901 - 985的SS串难题(字典树 & dfs)