HDU 2089不要62 数位dp

来源:互联网 发布:巴拉密 知乎 编辑:程序博客网 时间:2024/06/05 06:15
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N=10;int dp[N][3],a[N];int l,r;void init(){    dp[0][0]=1;    for(int i=1;i<N;i++){        dp[i][0]=dp[i-1][0]*9-dp[i-1][1];        dp[i][1]=dp[i-1][0];        dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1];    }}int f(int n){    memset(a,0,sizeof(a));    int len=0,ans=n,tmp=0;    bool flag=false;    while(n){        a[++len]=n%10;        n/=10;    }    for(int i=len;i>=1;i--){        tmp+=dp[i-1][2]*a[i];        if(flag){            tmp+=dp[i-1][0]*a[i];        }        if(!flag && 6==a[i+1] && a[i]>2)            tmp+=dp[i][1];//dp[i][1]        if(!flag && a[i]>4){            tmp+=dp[i-1][0];        }        if(!flag && a[i]>6)            tmp+=dp[i-1][1];        if(a[i]==4 || (6==a[i+1]&&2==a[i]))            flag=true;    }    return (ans-tmp);}int main(){    init();    while(scanf("%d%d",&l,&r),l+r){        cout<<f(r+1)-f(l)<<endl;    }    return 0;}

0 0
原创粉丝点击