fzu 2113
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
__int64 dp[20][20],num[20];
__int64 dfs(int pos,int n,bool flag)
{
if(pos<0) return n;
if(!flag && dp[pos][n]!=-1) return dp[pos][n];
int p=flag?num[pos]:9;
__int64 ans=0;
for(int i=0;i<=p;i++)
{
if(i==1) ans+=dfs(pos-1,n+1,flag && i==p);
else ans+=dfs(pos-1,n,flag && i==p);
}
if(!flag) dp[pos][n]=ans;//n表示pos位前面有多少个1
return ans;
}
__int64 cal(__int64 x)
{
int c=0;
while(x)
{
num[c++]=x%10;
x/=10;
}
return dfs(c-1,0,1);
}
int main()
{
memset(dp,-1,sizeof(dp));
__int64 l,r;
while(scanf("%I64d%I64d",&l,&r)!=EOF)
{
printf("%I64d\n",cal(r)-cal(l-1));
}
return 0;
}
hdu 2089
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int dp[8][2];
int num[8];
int dfs(int pos,bool six,bool flag) //six 表示上一位是不是6
{
if(pos<0) return 1;
if(!flag && dp[pos][six]!=-1) return dp[pos][six];
int u=flag?num[pos]:9;
int ans=0;
for(int i=0;i<=u;i++)
{
if(i==4 || (i==2 && six))
continue;
ans+=dfs(pos-1,i==6,flag && i==u);
}
if(!flag) dp[pos][six]=ans;
return ans;
}
int cal(int x)
{
int cnt=0;
while(x)
{
num[cnt++]=x%10;
x/=10;
}
return dfs(cnt-1,0,1);
}
int main()
{
int l,r;
memset(dp,-1,sizeof(dp));
while(scanf("%d%d",&l,&r)!=EOF)
{
if(l==0 && r==0) break;
printf("%d\n",cal(r)-cal(l-1));
}
return 0;
}