题目概述
求 [L,R] 中子串不含有 62 和 4 的数的个数。
解题报告
感觉重学了一遍数位DP……定义
之前写数位DP我都是枚举贴着 n 的位数,然后每次都刷DP,不仅慢而且有毒……
于是借鉴了一下网上dalao们的写法:先预处理出
示例程序
#include<cstdio>
using namespace std;
const int maxn=7;
int L,R,a[maxn+5],f[maxn+5][2]; //1:2 0:other
void Make()
{
f[0][0]=1;
for (int i=1;i<=maxn;i++)
for (int j=0;j<10;j++)
f[i][j==2]+=(j!=4)*(f[i-1][0]+(j!=6)*f[i-1][1]);
}
inline int Solve(int n)
{
n++;a[0]=0;do a[++a[0]]=n%10,n/=10; while (n);int ans=0;
for (int i=a[0],lst=0;i>=1;lst=a[i--])
{
int now=a[i]-(a[i]>4)-(lst==6&&a[i]>2);ans+=f[i-1][0]*now;
now-=a[i]>6;ans+=f[i-1][1]*now;
if (a[i]==4||lst==6&&a[i]==2) break;
}
return ans;
}
int main()
{
freopen("program.in","r",stdin);
freopen("program.out","w",stdout);
for (Make(),scanf("%d%d",&L,&R);L&&R;scanf("%d%d",&L,&R)) printf("%d\n",Solve(R)-Solve(L-1));
return 0;
}