//我写的第一个数位dp
//然而并不能理解
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 #include<cstdlib> 7 #include<queue> 8 #include<vector> 9 #include<map> 10 #include<stack> 11 #include<string> 12 13 using namespace std; 14 15 int l,r; 16 int f[10][3]; 17 //0 不包含 18 //1 不包含 首位为2 19 //2 包含 20 21 int get_num(int x){ 22 int t=0; 23 int tmp=x; 24 int ans=0; 25 int num[10]; 26 bool flag=0; 27 memset(num,0,sizeof(num)); 28 while (tmp!=0){ 29 num[++t]=tmp%10; 30 tmp=tmp/10; 31 } 32 for (int i=t;i>=1;i--){ 33 ans+=num[i]*f[i-1][2]; 34 if (flag){ 35 ans=ans+num[i]*f[i-1][0]; 36 } 37 else{ 38 if (num[i]>4) ans+=f[i-1][0]; 39 if (num[i+1]==6 && num[i]>2) ans+=f[i][1]; 40 if (num[i]>6) ans+=f[i-1][1]; 41 } 42 if (num[i]==4 || (num[i+1]==6 && num[i]==2)) flag=true; 43 } 44 return x-ans; 45 } 46 47 void INIT(){ 48 memset(f,0,sizeof(f)); 49 f[0][0]=1; 50 for (int i=1;i<=8;i++){ 51 f[i][0]=f[i-1][0]*9-f[i-1][1]; 52 f[i][1]=f[i-1][0]; 53 f[i][2]=f[i-1][2]*10+f[i-1][1]+f[i-1][0]; 54 } 55 } 56 57 int main(){ 58 INIT(); 59 while (scanf("%d%d",&l,&r)==2){ 60 if (l==0 && r==0) return 0; 61 printf("%d\n",get_num(r+1)-get_num(l)); 62 } 63 return 0; 64 } 65 /* 66 1 100 67 0 0 68 */
时间: 2024-11-07 09:43:18