[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; }