[swustoj 1097] 2014

时间:2023-03-08 17:44:02

2014(1097)

问题描述

今年是2014年,所以小明喜欢2014的每一位数字(即:2,0,1,4),小明想知道在区间[l,r](包括l和r)中有多少个数中含有这4个数字(数字无前缀零)。

输入

多组数据。

每组数据输入2个数l,r(0<l<r<=10^9)

输出

输出占一行,即区间[l,r](包括l和r)中包含的满足条件的数的个数

样例输入

1 10
100 1024

样例输出

简单数位DP

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std; int bit[];
int dp[][][][][]; int dfs(int pos,int n2,int n0,int n1,int n4,bool limit,bool fzero)
{
if(pos==-)
{
return n2&n0&n1&n4;
}
if(!limit && !fzero && dp[pos][n2][n0][n1][n4]!=-) return dp[pos][n2][n0][n1][n4];
int end=limit?bit[pos]:;
int ans=;
for(int i=;i<=end;i++)
{
int nn2=i==?:;
int nn0=i==?:;
int nn1=i==?:;
int nn4=i==?:;
if(fzero) nn0=;
ans+=dfs(pos-,n2|nn2,n0|nn0,n1|nn1,n4|nn4,limit && i==end,fzero && !i);
}
if(!limit && !fzero) dp[pos][n2][n0][n1][n4]=ans;
return ans;
}
int cal(int n)
{
int len=;
while(n)
{
bit[len++]=n%;
n/=;
}
return dfs(len-,,,,,,);
}
int main()
{
int l,r;
memset(dp,-,sizeof(dp));
while(cin>>l>>r)
{
cout<<cal(r)-cal(l-)<<"\n";
}
return ;
}