NWU_ACM

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
#include<stdio.h>
long long int n,m;
long long int a[10][10]={0},t[12]={0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000};//a[i][j]表示开头是j的i位数
void dp()
{
    int i,j,k,l;
    for(i=0;i<10;i++)
        a[1][i]=1;
    a[1][4]=0;
    for(i=2;i<9;i++)
    {
        for(j=0;j<10;j++)
        {
            if(j==4) continue;
            for(k=0;k<10;k++)
            {
                if((j==6)&&(k==2)) continue;
                else a[i][j]+=a[i-1][k];
            }
        }
    }
}
long long int find(long long int n)
{
    long long int ans=0;
    int i,j,k=0,l,num,last;
    while(n>=t[k]) k++;
    k--;
    for(i=1;i<k;i++)
    {
        for(j=1;j<10;j++)
        {
            ans+=a[i][j];
        }
    }
    num=n/t[k];
    for(i=1;i<num;i++)
    {
        if(i==4) continue;
        else ans+=a[k][i];
    }
    n%=t[k];
    last=num;
    if(num!=4)
    {
        for(i=k-1;i>0;i--)
        {
            num=n/t[i];
            for(j=0;j<num;j++)
            {
                if((last==6)&&(j==2)) continue;
                else if(j==4) continue;
                else ans+=a[i][j];
            }
            if((last==6)&&(num==2)) break;
            if(num==4) break;
            last=num;
            n%=t[i];
        }
    }
    return ans;


}
int main()
{
    dp();
    int i,j,k,l;
    while(scanf("%lld %lld",&n,&m)!=EOF)
    {
        if((n==0)&&(m==0)) break;
        printf("%lld\n",find(m+1)-find(n));
    }
}

  

posted on 2017-05-31 19:03  NWU_ACM  阅读(100)  评论(0编辑  收藏  举报