完美数
Time Limit: 2000/1000MS (Java/Others)
Memory Limit: 128000/64000KB (Java/Others)
Problem Description
8是中国人很喜欢的一个数字,但是如果有3的存在就变成了38,就不是很好了。。
你能告诉我,在[L, R] 的正整数区间内,要么包含3 要么包含 8 的不同的整数有多少个么?
Input
第一行一个整数T (T ≤ 10000),代表数据的组数
对于每组数据给两个整数 L, R (1 ≤ L ≤ R ≤ 1e9)
Output
对于每组数据,给一个整数为答案。
Sample Input
3 1 100 1 3 8 8
Sample Output
34 1 1
Source
buaads
Manager
数位DP模版改一下。
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int maxn = 500+44;
const int inf = 0x3f3f3f3f;
int num[11];
int dp[11][3];
int dfs(int pos,int sta,bool limit)
{
if(pos==0&&(sta==1||sta==2)) return 1;
if(pos==0) return 0;
if(!limit&&dp[pos][sta]!=-1) return dp[pos][sta];
int up=limit?num[pos]:9;
int temp=0;
for(int i=0;i<=up;i++){
if(sta==0&&i==3){
temp+=dfs(pos-1,1,limit&&i==num[pos]);
}
else if(sta==2&&i==3){
continue;
}else if(sta==1&&i==8){
continue;
}else if(sta==0&&i==8){
temp+=dfs(pos-1,2,limit&&i==num[pos]);
}else{
temp+=dfs(pos-1,sta,limit&&i==num[pos]);
}
}
if(!limit) dp[pos][sta]=temp;
return temp;
}
int doit(int x)
{
int cnt=0;
while(x){
num[++cnt]=x%10;
x=x/10;
}
return dfs(cnt,0,true);
}
int main()
{
int n,m;
memset(dp,-1,sizeof dp);
int T;
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&m);
printf("%d\n",doit(m)-doit(n-1));
}
}