统计区间内有多少个符合要求的数,2089要的是不含4和62的数,3555要的是不含49的数..都是基础的数位统计问题,直接贴模板了...话说数位dp居然还有模板,果然是too young....
2089
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
typedef long long ll;
using namespace std;
int dp[15][2];
int num[15];
int f(int pos,int st,bool limit)
{
if(pos==-1) return 1;
if(!limit&&dp[pos][st]!=-1)
return dp[pos][st];
int ans=0;
int last=limit?num[pos]:9;
for(int i=0;i<=last;++i)
{
if(i==4||(i==2&&st)) continue;
ans+=f(pos-1,i==6,limit&&i==last);
}
if(!limit) dp[pos][st]=ans;
return ans;
}
int cal(int x)
{
int len=0;
while(x)
{
num[len++]=x%10;
x/=10;
}
return f(len-1,0,true);
}
int s,p,q,n,m,k;
int main()
{
// freopen("in.txt","r",stdin);
while(~scanf("%d%d",&p,&q))
{
memset(dp,-1,sizeof dp);
if (!p && !q) break;
cout<<cal(q)-cal(p-1)<<endl;
}
}
3555
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
typedef unsigned long long ll;
using namespace std;
ll dp[32][2];
ll num[32];
ll f(int pos,int st,bool limit)
{
if(pos==-1) return 1;
if(!limit&&dp[pos][st]!=-1)
return dp[pos][st];
ll ans=0;
int last=limit?num[pos]:9;
for(int i=0;i<=last;++i)
{
if((i==9&&st)) continue;
ans+=f(pos-1,i==4,limit&&i==last);
}
if(!limit) dp[pos][st]=ans;
return ans;
}
ll cal(ll x)
{
int len=0;
while(x)
{
num[len++]=x%10;
x/=10;
}
return f(len-1,0,true);
}
ll p;
int tt;
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d",&tt);
while(tt--)
{
scanf("%I64d",&p);
memset(dp,-1,sizeof dp);
ll ans=p-cal(p);
ans++;
cout<<ans<<endl;
}
}