sdut 3904 数位dp(题目数据范围是错的)

来源:互联网 发布:淘宝店铺如何一件代发 编辑:程序博客网 时间:2024/06/06 03:25
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int num[10][10],sum[10],pow_ten[10],cnt,a[10],ans;void init(){    num[2][4]=1;    sum[2]=1;    int i,j;    for(i=1,pow_ten[0]=1;i<=9;i++)        pow_ten[i]=pow_ten[i-1]*10;    for(i=3;i<=9;i++)    {        for(j=0;j<4;j++)            num[i][j]=sum[i-1];        num[i][j]=pow_ten[i-2]+sum[i-1]-num[i-1][7];        for(++j;j<10;j++)            num[i][j]=sum[i-1];        sum[i]=sum[i-1]*10+pow_ten[i-2]-num[i-1][7];    }}void dfs(int k,bool fro){    if(fro)    {        int res=0;        while(k)        {            res=res*10+a[k];            k--;        }        ans+=res+1;        return;    }    if(!k) return;    for(int i=0;i<a[k];i++)        ans+=num[k][i];    if(a[k]>7&&k+1<cnt&&a[k+1]==4)        ans+=pow_ten[k-1]-num[k][7];    dfs(k-1,(a[k]==7&&k+1<cnt&&a[k+1]==4)?true:false);}int solve(int n){    cnt=1;ans=0;    while(n)    {        a[cnt++]=n%10;        n/=10;    }    dfs(cnt-1,false);    return ans;}bool cal(int n){    while(n>=10)    {        if(n%100==47)            return true;        n/=10;    }    return false;}int check(int n){    int cnt=0;    for(int i=1;i<=n;i++)    {        if(cal(i))            cnt++;    }    return n-cnt;}int main(){    int i,j,t,s,e;    init();    scanf("%d",&t);    while(t--&&scanf("%d%d",&s,&e)!=EOF)        printf("%d\n",e-s+1-solve(e)+solve(s-1));    return 0;}

原创粉丝点击