HDU2089 不要62

 
一道很裸的数位dp。
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1e6+10;
int l,r,mi[maxn],dp[12][2],ans;

int aa;char cc;
int read() {
	aa=0;cc=getchar();
	while(cc<'0'||cc>'9') cc=getchar();
	while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
	return aa;
}

int len(int x) { int rs=0;while(x) { rs++;x/=10; } return rs;}

int f(int pos,int p) {//2:lim 1:last==6 
	if(!pos) return 1;
	if(!(p&2)&&dp[pos][p]!=-1) return dp[pos][p];
	int d= (p&2)? (r/mi[pos-1])%10 : 9,rs=0;
	for(int i=0;i<=d;++i) if(i!=4&&!(p&(i==2))) rs+=f(pos-1,(p&((i==d)<<1))+(i==6));
	if(!(p&2)) dp[pos][p]=rs;
	return rs;
}

int main() {
	l=read();r=read(); mi[0]=1;
	for(int i=1;i<=10;++i) mi[i]=mi[i-1]*10;
	memset(dp,-1,sizeof(dp));
	while(r) {
		ans=f(len(r),2);r=l-1;
		ans-=f(len(r),2);
		printf("%d\n",ans);
		l=read();r=read();
	}
	return 0;
}

  

posted @ 2017-10-05 16:05  shixinyi  阅读(132)  评论(0编辑  收藏  举报