hdu 2089 不要62(数位dp)暴力

来源:互联网 发布:浪潮软件二级部门 编辑:程序博客网 时间:2024/05/23 21:28
#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#define maxn 1000010using namespace std;int dp[12][3];//dp[i][0],表示不存在不吉利数字//dp[i][1],表示不存在不吉利数字,且最高位为2//dp[i][2],表示存在不吉利数字void init(){    memset(dp,0,sizeof(dp));    dp[0][0]=1;    for(int i=1;i<=9;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][1]+dp[i-1][2]*10+dp[i-1][0];    }}int solve(int n){int i,len = 0,a[12],flag = 0,ans = 0,tem=n;while(n){     a[++len] = n%10;        n/=10;}a[len+1]=0;for(i=len;i;i--){    ans+=dp[i-1][2]*a[i];    if(flag)    {        ans+=dp[i-1][0]*a[i];    }     if(!flag&&a[i]>4)        {            ans+=dp[i-1][0];        }if(!flag&&a[i+1]==6&&a[i]>2)        {            ans+=dp[i][1];        }     if(!flag && a[i]>6)  ans+=dp[i-1][1];  if((a[i+1]==6&&a[i]==2)||a[i]==4)flag=1;}return tem-ans;}int main(){    init();    int t;   int a,b;   while(cin>>a>>b)   {       if(a==0&&b==0)break;       cout<<solve(b+1)-solve(a)<<endl;   }    return 0;}
#include<bits/stdc++.h>using namespace std;#define  pb push_backint sum[1000009];void init(){    sum[1]=1;    int tmp,last;    for(int i=2;i<=1000000;i++)    {         tmp=i;         last=0;         sum[i]=sum[i-1]+1;            while(tmp)            {                if(tmp%10==4){sum[i]=sum[i-1];break;}                if(tmp%10==6&&last==2){sum[i]=sum[i-1];break;}                last=tmp%10;                tmp/=10;            }    }}int main(){//freopen("in.txt","r",stdin);//  freopen("out.txt","w",stdout);//ios::sync_with_stdio(false);    int n,m;    init();    while(~scanf("%d%d",&n,&m)&&n)    {        if(n==0&&m==0)break;        printf("%d\n",sum[m]-sum[n-1]);    }    return 0;}


0 0
原创粉丝点击