这题其实不用数位DP,很神奇的一个做法
考虑到数据范围只有1e6,预处理打表。
判断时,卡一下常数。
卡常数的注意点有:
1.将数转换成字符串,不能用stringstream&string,否则应该TLE,只能模拟分解
while(x) { a[++cnt]=x%10; x/=10; }
像这样
2.两行优化
#pragma GCC optimize (2) #pragma GCC optimize (3)
3.判断不符合要求的,再用总个数减去
printf("%d\n",m-n+1-f[m]+f[n-1]);
代码:
#pragma GCC optimize (2) #pragma GCC optimize (3) #include<bits/stdc++.h> #define rd(x) x=read() using namespace std; int n,m; int f[1000005]; int a[10]; inline int read() { int f=1,x=0;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();} return x*f; } bool check(int x) { int cnt=0; memset(a,0,sizeof(a)); while(x) { a[++cnt]=x%10; x/=10; if(a[cnt]==4)return true; } for(int i=1;i<cnt;i++) if(a[i]==2&&a[i+1]==6) return true; return false; } int main() { f[1]=0; for(int i=2;i<=1000000;i++)f[i]=f[i-1]+check(i); while(scanf("%d%d",&n,&m)!=EOF&&n&&m) { printf("%d\n",m-n+1-f[m]+f[n-1]); } return 0; }