题目传送门
题意: 在给定区间 [ n , m ] [n,m] [n,m]内,寻找有多少个数字的数位中,不包含4或者62。
思路: 考虑使用前缀和思想, a n s [ i ] ans[i] ans[i]表示从 [ 0 , i ] [0,i] [0,i]中有多少个符合的数字,处理出 a n s [ m ] − a n s [ n − 1 ] ans[m]-ans[n-1] ans[m]−ans[n−1]。
代码:
#include<bits/stdc++.h>
#define endl '\n'
#define mp make_pair
#define pb push_back
#define ll long long
#define int long long
#define pii pair<int,int>
#define sz(x) (int)(x).size()
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
char *fs,*ft,buf[1<<20];
#define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
inline int read()
{
int x=0,f=1;
char ch=gc();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=gc();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=gc();
}
return x*f;
}
using namespace std;
const int N=1e3+50;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
int a[N],len=0,f[15][15];
int dfs(int pos,int pre,int limit)
{
if(pos==0) return 1;
if(!limit&&f[pos][pre]!=-1) return f[pos][pre];
int high = limit?a[pos]:9,res=0;
for(int i=0;i<=high;i++)
{
if(i==4||(i==2&&pre==6)) continue;
res+=dfs(pos-1,i,limit&&i==high);
}
if(!limit) f[pos][pre] = res;
return res;
}
int work(int x)
{
len=0;
while(x) a[++len]=x%10,x/=10;
//mem(f,-1);
return dfs(len,0,1);
}
void solve()
{
mem(f,-1);
int n,m;
while(cin>>n>>m)
{
if(n+m==0) break;
cout<<work(m)-work(n-1)<<endl;
}
}
signed main()
{
// int _;
// cin>>_;
// while(_--)
solve();
}