[CQOI2016]手机号码

[CQOI2016]手机号码

Description

人们选择手机号码时都希望号码好记、吉利。比如号码中含有几位相邻的相同数字、不含谐音不
吉利的数字等。手机运营商在发行新号码时也会考虑这些因素,从号段中选取含有某些特征的号
码单独出售。为了便于前期规划,运营商希望开发一个工具来自动统计号段中满足特征的号码数
量。
工具需要检测的号码特征有两个:号码中要出现至少3个相邻的相同数字,号码中不能同
时出现8和4。号码必须同时包含两个特征才满足条件。满足条件的号码例如:13000988721、
23333333333、14444101000。而不满足条件的号码例如:1015400080、10010012022。
手机号码一定是11位数,前不含前导的0。工具接收两个数L和R,自动统计出[L,R]区间
内所有满足条件的号码数量。L和R也是11位的手机号码

Solution:

一眼看过去。裸的数位dp

就是限制比较多。

1.三个相邻数字,就要记录这一位,上一位,还要记录有没有出现过连续三个

2.不能同时出现8,4,记录有没有出现8,有没有出现4

3.套路地,记录一个有没有超出上限。

所以,f[i][lim][last][this][连续三个 0/1 ][4 ? 0/1][ 8 ? 0/1]

然后就写就好了。

个人不喜欢for循环0/1限制,所以直接枚举的0/1搭配情况。

Code:(就是长了点,331行罢了)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=13;
ll l,r;
ll f[N][2][10][10][2][2][2];
int num[N],cnt;
bool is=false;
ll wrk(){
    memset(f,0,sizeof f);
    for(int i=0;i<=num[cnt]*10+num[cnt-1];i++){
        int y=i%10,x=i/10;
        if(y==num[cnt-1]&&x==num[cnt]){
            f[cnt-1][1][x][y][0][(x==4)||(y==4)][(x==8)||(y==8)]++;
        }
        else{
            f[cnt-1][0][x][y][0][(x==4)||(y==4)][(x==8)||(y==8)]++;
        }
    }
    for(int i=cnt-2;i>=1;i--){
        for(int j=0;j<=9;j++){
            for(int k=0;k<=9;k++){
                for(int p=0;p<=9;p++){
                    if(p<num[i]){
                        if(p==4){
                            if(k!=p||p!=j||j!=k){
                            
                            f[i][0][k][p][1][1][1]+=f[i+1][1][j][k][1][1][1]+f[i+1][0][j][k][1][1][1]+f[i+1][1][j][k][1][0][1]+f[i+1][0][j][k][1][0][1];
                            
                            f[i][0][k][p][0][1][1]+=f[i+1][1][j][k][0][1][1]+f[i+1][0][j][k][0][1][1]+f[i+1][1][j][k][0][0][1]+f[i+1][0][j][k][0][0][1];
                            
                            f[i][0][k][p][1][1][0]+=f[i+1][1][j][k][1][1][0]+f[i+1][0][j][k][1][1][0]+f[i+1][1][j][k][1][0][0]+f[i+1][0][j][k][1][0][0];
                            
                            f[i][0][k][p][0][1][0]+=f[i+1][1][j][k][0][1][0]+f[i+1][0][j][k][0][1][0]+f[i+1][1][j][k][0][0][0]+f[i+1][0][j][k][0][0][0];
                            
                            }
                            else if (k==p&&p==j){
                                f[i][0][k][p][1][1][1]+=f[i+1][1][j][k][1][1][1]+f[i+1][0][j][k][1][1][1]+f[i+1][1][j][k][1][0][1]+f[i+1][0][j][k][1][0][1]+    f[i+1][1][j][k][0][1][1]+f[i+1][0][j][k][0][1][1]+f[i+1][1][j][k][0][0][1]+f[i+1][0][j][k][0][0][1];
                            
                                f[i][0][k][p][1][1][0]+=f[i+1][1][j][k][1][1][0]+f[i+1][0][j][k][1][1][0]+f[i+1][1][j][k][1][0][0]+f[i+1][0][j][k][1][0][0]+    f[i+1][1][j][k][0][1][0]+f[i+1][0][j][k][0][1][0]+f[i+1][1][j][k][0][0][0]+f[i+1][0][j][k][0][0][0];
                            
                            }
                            
                        }
                        else if(p==8){
                            
                            if(k!=p||p!=j||j!=k){
                            
                            f[i][0][k][p][1][1][1]+=f[i+1][1][j][k][1][1][1]+f[i+1][0][j][k][1][1][1]+f[i+1][1][j][k][1][1][0]+f[i+1][0][j][k][1][1][0];
                            
                            f[i][0][k][p][0][1][1]+=f[i+1][1][j][k][0][1][1]+f[i+1][0][j][k][0][1][1]+f[i+1][1][j][k][0][1][0]+f[i+1][0][j][k][0][1][0];
                            
                            f[i][0][k][p][1][0][1]+=f[i+1][1][j][k][1][0][1]+f[i+1][0][j][k][1][0][1]+f[i+1][1][j][k][1][0][0]+f[i+1][0][j][k][1][0][0];
                            
                            f[i][0][k][p][0][0][1]+=f[i+1][1][j][k][0][0][1]+f[i+1][0][j][k][0][0][1]+f[i+1][1][j][k][0][0][0]+f[i+1][0][j][k][0][0][0];
                            
                            }
                            else if (k==p&&p==j){
                                f[i][0][k][p][1][1][1]+=f[i+1][1][j][k][1][1][1]+f[i+1][0][j][k][1][1][1]+f[i+1][1][j][k][1][1][0]+f[i+1][0][j][k][1][1][0]+    f[i+1][1][j][k][0][1][1]+f[i+1][0][j][k][0][1][1]+f[i+1][1][j][k][0][1][0]+f[i+1][0][j][k][0][1][0];
                            
                                f[i][0][k][p][1][0][1]+=f[i+1][1][j][k][1][0][1]+f[i+1][0][j][k][1][0][1]+f[i+1][1][j][k][1][0][0]+f[i+1][0][j][k][1][0][0]+    f[i+1][1][j][k][0][0][1]+f[i+1][0][j][k][0][0][1]+f[i+1][1][j][k][0][0][0]+f[i+1][0][j][k][0][0][0];
                            
                            }
                            
                        }
                        else{
                            
                            if(k!=p||p!=j||j!=k){
                            
                            f[i][0][k][p][1][1][1]+=f[i+1][1][j][k][1][1][1]+f[i+1][0][j][k][1][1][1];
                            
                            f[i][0][k][p][0][1][1]+=f[i+1][1][j][k][0][1][1]+f[i+1][0][j][k][0][1][1];
                            
                            f[i][0][k][p][1][1][0]+=f[i+1][1][j][k][1][1][0]+f[i+1][0][j][k][1][1][0];
                            
                            f[i][0][k][p][0][1][0]+=f[i+1][1][j][k][0][1][0]+f[i+1][0][j][k][0][1][0];
                            
                            f[i][0][k][p][1][0][1]+=f[i+1][1][j][k][1][0][1]+f[i+1][0][j][k][1][0][1];
                            
                            f[i][0][k][p][0][0][1]+=f[i+1][1][j][k][0][0][1]+f[i+1][0][j][k][0][0][1];
                            
                            f[i][0][k][p][1][0][0]+=f[i+1][1][j][k][1][0][0]+f[i+1][0][j][k][1][0][0];
                            
                            f[i][0][k][p][0][0][0]+=f[i+1][1][j][k][0][0][0]+f[i+1][0][j][k][0][0][0];
                            
                            }
                            else if (k==p&&p==j){
                                f[i][0][k][p][1][1][1]+=f[i+1][1][j][k][1][1][1]+f[i+1][0][j][k][1][1][1]+    f[i+1][1][j][k][0][1][1]+f[i+1][0][j][k][0][1][1];
                            
                                f[i][0][k][p][1][1][0]+=f[i+1][1][j][k][1][1][0]+f[i+1][0][j][k][1][1][0]+    f[i+1][1][j][k][0][1][0]+f[i+1][0][j][k][0][1][0];
                            
                                f[i][0][k][p][1][0][1]+=f[i+1][1][j][k][1][0][1]+f[i+1][0][j][k][1][0][1]+    f[i+1][1][j][k][0][0][1]+f[i+1][0][j][k][0][0][1];
                            
                                f[i][0][k][p][1][0][0]+=f[i+1][1][j][k][1][0][0]+f[i+1][0][j][k][1][0][0]+    f[i+1][1][j][k][0][0][0]+f[i+1][0][j][k][0][0][0];
                            
                            }
                        }
                    }
                    else if(p==num[i]){
                        if(p==4){
                            if(k!=p||p!=j||j!=k){
                            
                            f[i][0][k][p][1][1][1]+=f[i+1][0][j][k][1][1][1]+f[i+1][0][j][k][1][0][1];
                            
                            f[i][0][k][p][0][1][1]+=f[i+1][0][j][k][0][1][1]+f[i+1][0][j][k][0][0][1];
                            
                            f[i][0][k][p][1][1][0]+=f[i+1][0][j][k][1][1][0]+f[i+1][0][j][k][1][0][0];
                            
                            f[i][0][k][p][0][1][0]+=f[i+1][0][j][k][0][1][0]+f[i+1][0][j][k][0][0][0];
                            
                            f[i][1][k][p][1][1][1]+=f[i+1][1][j][k][1][1][1]+f[i+1][1][j][k][1][0][1];
                            
                            f[i][1][k][p][0][1][1]+=f[i+1][1][j][k][0][1][1]+f[i+1][1][j][k][0][0][1];
                            
                            f[i][1][k][p][1][1][0]+=f[i+1][1][j][k][1][1][0]+f[i+1][1][j][k][1][0][0];
                            
                            f[i][1][k][p][0][1][0]+=f[i+1][1][j][k][0][1][0]+f[i+1][1][j][k][0][0][0];
                            
                            }
                            else if (k==p&&p==j){
                                f[i][0][k][p][1][1][1]+=f[i+1][0][j][k][1][1][1]+f[i+1][0][j][k][1][0][1]+    f[i+1][0][j][k][0][1][1]+f[i+1][0][j][k][0][0][1];
                               
                                f[i][1][k][p][1][1][1]+=f[i+1][1][j][k][1][1][1]+f[i+1][1][j][k][1][0][1]+    f[i+1][1][j][k][0][1][1]+f[i+1][1][j][k][0][0][1];
                                
                                f[i][0][k][p][1][1][0]+=f[i+1][0][j][k][1][1][0]+f[i+1][0][j][k][1][0][0]+    f[i+1][0][j][k][0][1][0]+f[i+1][0][j][k][0][0][0];
                            
                                f[i][1][k][p][1][1][0]+=f[i+1][1][j][k][1][1][0]+f[i+1][1][j][k][1][0][0]+    f[i+1][1][j][k][0][1][0]+f[i+1][1][j][k][0][0][0];
                                
                            }
                        }
                        else if(p==8){
                            
                            if(k!=p||p!=j||j!=k){
                            
                            f[i][0][k][p][1][1][1]+=f[i+1][0][j][k][1][1][1]+f[i+1][0][j][k][1][1][0];
                            
                            f[i][0][k][p][0][1][1]+=f[i+1][0][j][k][0][1][1]+f[i+1][0][j][k][0][1][0];
                            
                            f[i][0][k][p][1][0][1]+=f[i+1][0][j][k][1][0][1]+f[i+1][0][j][k][1][0][0];
                            
                            f[i][0][k][p][0][0][1]+=f[i+1][0][j][k][0][0][1]+f[i+1][0][j][k][0][0][0];
                            
                            f[i][1][k][p][1][1][1]+=f[i+1][1][j][k][1][1][1]+f[i+1][1][j][k][1][1][0];
                            
                            f[i][1][k][p][0][1][1]+=f[i+1][1][j][k][0][1][1]+f[i+1][1][j][k][0][1][0];
                            
                            f[i][1][k][p][1][0][1]+=f[i+1][1][j][k][1][0][1]+f[i+1][1][j][k][1][0][0];
                            
                            f[i][1][k][p][0][0][1]+=f[i+1][1][j][k][0][0][1]+f[i+1][1][j][k][0][0][0];
                            
                            }
                            else if (k==p&&p==j){
                                f[i][0][k][p][1][1][1]+=f[i+1][0][j][k][1][1][1]+f[i+1][0][j][k][1][1][0]+    f[i+1][0][j][k][0][1][1]+f[i+1][0][j][k][0][1][0];
                               
                                f[i][1][k][p][1][1][1]+=f[i+1][1][j][k][1][1][1]+f[i+1][1][j][k][1][1][0]+    f[i+1][1][j][k][0][1][1]+f[i+1][1][j][k][0][1][0];
                                
                                f[i][0][k][p][1][0][1]+=f[i+1][0][j][k][1][0][1]+f[i+1][0][j][k][1][0][0]+    f[i+1][0][j][k][0][0][1]+f[i+1][0][j][k][0][0][0];
                            
                                f[i][1][k][p][1][0][1]+=f[i+1][1][j][k][1][0][1]+f[i+1][1][j][k][1][0][0]+    f[i+1][1][j][k][0][0][1]+f[i+1][1][j][k][0][0][0];
                            
                            }
                        }
                        else{
                            
                            if(k!=p||p!=j||j!=k){
                            
                            f[i][0][k][p][1][1][1]+=f[i+1][0][j][k][1][1][1];
                            
                            f[i][0][k][p][0][1][1]+=f[i+1][0][j][k][0][1][1];
                            
                            f[i][0][k][p][1][1][0]+=f[i+1][0][j][k][1][1][0];
                            
                            f[i][0][k][p][0][1][0]+=f[i+1][0][j][k][0][1][0];
                            
                            f[i][0][k][p][1][0][1]+=f[i+1][0][j][k][1][0][1];
                            
                            f[i][0][k][p][0][0][1]+=f[i+1][0][j][k][0][0][1];
                            
                            f[i][0][k][p][1][0][0]+=f[i+1][0][j][k][1][0][0];
                            
                            f[i][0][k][p][0][0][0]+=f[i+1][0][j][k][0][0][0];
                            
                            
                            f[i][1][k][p][1][1][1]+=f[i+1][1][j][k][1][1][1];
                            
                            f[i][1][k][p][0][1][1]+=f[i+1][1][j][k][0][1][1];
                            
                            f[i][1][k][p][1][1][0]+=f[i+1][1][j][k][1][1][0];
                            
                            f[i][1][k][p][0][1][0]+=f[i+1][1][j][k][0][1][0];
                            
                            f[i][1][k][p][1][0][1]+=f[i+1][1][j][k][1][0][1];
                            
                            f[i][1][k][p][0][0][1]+=f[i+1][1][j][k][0][0][1];
                            
                            f[i][1][k][p][1][0][0]+=f[i+1][1][j][k][1][0][0];
                            
                            f[i][1][k][p][0][0][0]+=f[i+1][1][j][k][0][0][0];
                            
                            }
                            else if (k==p&&p==j){
                                f[i][0][k][p][1][1][1]+=f[i+1][0][j][k][1][1][1]+    f[i+1][0][j][k][0][1][1];
                            
                                f[i][0][k][p][1][1][0]+=f[i+1][0][j][k][1][1][0]+    f[i+1][0][j][k][0][1][0];
                            
                                f[i][0][k][p][1][0][1]+=f[i+1][0][j][k][1][0][1]+    f[i+1][0][j][k][0][0][1];
                            
                                f[i][0][k][p][1][0][0]+=f[i+1][0][j][k][1][0][0]+    f[i+1][0][j][k][0][0][0];
                            
                            
                                f[i][1][k][p][1][1][1]+=f[i+1][1][j][k][1][1][1]+    f[i+1][1][j][k][0][1][1];
                            
                                f[i][1][k][p][1][1][0]+=f[i+1][1][j][k][1][1][0]+    f[i+1][1][j][k][0][1][0];
                            
                                f[i][1][k][p][1][0][1]+=f[i+1][1][j][k][1][0][1]+    f[i+1][1][j][k][0][0][1];
                            
                                f[i][1][k][p][1][0][0]+=f[i+1][1][j][k][1][0][0]+    f[i+1][1][j][k][0][0][0];
                            
                            }
                            
                        }
                    }
                    else{// p>num[i]
                        
                        if(p==4){
                            if(k!=p||p!=j||j!=k){
                            
                            f[i][0][k][p][1][1][1]+=f[i+1][0][j][k][1][1][1]+f[i+1][0][j][k][1][0][1];
                            
                            f[i][0][k][p][0][1][1]+=f[i+1][0][j][k][0][1][1]+f[i+1][0][j][k][0][0][1];
                            
                            f[i][0][k][p][1][1][0]+=f[i+1][0][j][k][1][1][0]+f[i+1][0][j][k][1][0][0];
                            
                            f[i][0][k][p][0][1][0]+=f[i+1][0][j][k][0][1][0]+f[i+1][0][j][k][0][0][0];
                            
                            }
                            else if (k==p&&p==j){
                                f[i][0][k][p][1][1][1]+=f[i+1][0][j][k][1][1][1]+f[i+1][0][j][k][1][0][1]+    f[i+1][0][j][k][0][1][1]+f[i+1][0][j][k][0][0][1];
                               
                                f[i][0][k][p][1][1][0]+=f[i+1][0][j][k][1][1][0]+f[i+1][0][j][k][1][0][0]+    f[i+1][0][j][k][0][1][0]+f[i+1][0][j][k][0][0][0];
                            
                            }
                        }
                        else if(p==8){
                            
                            if(k!=p||p!=j||j!=k){
                            
                            f[i][0][k][p][1][1][1]+=f[i+1][0][j][k][1][1][1]+f[i+1][0][j][k][1][1][0];
                            
                            f[i][0][k][p][0][1][1]+=f[i+1][0][j][k][0][1][1]+f[i+1][0][j][k][0][1][0];
                            
                            f[i][0][k][p][1][0][1]+=f[i+1][0][j][k][1][0][1]+f[i+1][0][j][k][1][0][0];
                            
                            f[i][0][k][p][0][0][1]+=f[i+1][0][j][k][0][0][1]+f[i+1][0][j][k][0][0][0];
                            
                            }
                            else if (k==p&&p==j){
                                f[i][0][k][p][1][1][1]+=f[i+1][0][j][k][1][1][1]+f[i+1][0][j][k][1][1][0]+    f[i+1][0][j][k][0][1][1]+f[i+1][0][j][k][0][1][0];
                               
                                f[i][0][k][p][1][0][1]+=f[i+1][0][j][k][1][0][1]+f[i+1][0][j][k][1][0][0]+    f[i+1][0][j][k][0][0][1]+f[i+1][0][j][k][0][0][0];
                            
                            }
                        }
                        else{
                            
                            if(k!=p||p!=j||j!=k){
                            
                            f[i][0][k][p][1][1][1]+=f[i+1][0][j][k][1][1][1];
                            
                            f[i][0][k][p][0][1][1]+=f[i+1][0][j][k][0][1][1];
                            
                            f[i][0][k][p][1][1][0]+=f[i+1][0][j][k][1][1][0];
                            
                            f[i][0][k][p][0][1][0]+=f[i+1][0][j][k][0][1][0];
                            
                            f[i][0][k][p][1][0][1]+=f[i+1][0][j][k][1][0][1];
                            
                            f[i][0][k][p][0][0][1]+=f[i+1][0][j][k][0][0][1];
                            
                            f[i][0][k][p][1][0][0]+=f[i+1][0][j][k][1][0][0];
                            
                            f[i][0][k][p][0][0][0]+=f[i+1][0][j][k][0][0][0];
                            
                            }
                            else if (k==p&&p==j){
                                f[i][0][k][p][1][1][1]+=f[i+1][0][j][k][1][1][1]+    f[i+1][0][j][k][0][1][1];
                            
                                f[i][0][k][p][1][1][0]+=f[i+1][0][j][k][1][1][0]+    f[i+1][0][j][k][0][1][0];
                            
                                f[i][0][k][p][1][0][1]+=f[i+1][0][j][k][1][0][1]+    f[i+1][0][j][k][0][0][1];
                            
                                f[i][0][k][p][1][0][0]+=f[i+1][0][j][k][1][0][0]+    f[i+1][0][j][k][0][0][0];
                            
                            }
                            
                        }
                        
                    }
                }
            }
        }
    }
    
    ll ret=0;
    for(int j=0;j<=9;j++)
     for(int k=0;k<=9;k++){
         ret+=f[1][0][j][k][1][1][0]+f[1][1][j][k][1][1][0]+f[1][0][j][k][1][0][1]+f[1][1][j][k][1][0][1]+f[1][0][j][k][1][0][0]+f[1][1][j][k][1][0][0];
     }
    return ret;
}
int main()
{
    scanf("%lld%lld",&l,&r);
    
    if(l!=1e10) l--;
    else is=true;
    
    while(l){
        num[++cnt]=l%10;l/=10;
    }
    ll ans1=wrk();
    
    cnt=0;
    while(r){
        num[++cnt]=r%10;r/=10;
    }
    ll ans2=wrk();
    
    printf("%lld",ans2-ans1+is);
    return 0;
}

 

posted @ 2018-08-28 15:59  *Miracle*  阅读(374)  评论(1编辑  收藏  举报