【hdu2809】 不要62
http://acm.hdu.edu.cn/showproblem.php?pid=2089 (题目链接)
题意
求区间${[n,m]}$中不含有62和4的数的个数。
Solution
数位dp板子。
代码
// hdu2089 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<ctime> #define LL long long #define inf (1ll<<30) #define MOD 1004535809 #define Pi acos(-1.0) #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout); using namespace std; int t[10],f[10][10],g[10]; int ans,a[2],n; void solve(int p) { for (n=0;a[p];a[p]/=10) t[++n]=a[p]%10; memset(f,0,sizeof(f));memset(g,0,sizeof(g)); if (t[1]!=4) g[1]=1; for (int i=0;i<10;i++) if (i!=4) f[1][i]=1; for (int i=2;i<=n;i++) { for (int j=0;j<10;j++) { if (j==4) continue; for (int k=0;k<10;k++) if (j!=6 || k!=2) f[i][j]+=f[i-1][k]; } if (t[i]==4) continue; for (int k=0;k<t[i-1];k++) if (t[i]!=6 || k!=2) g[i]+=f[i-1][k]; if (t[i]!=6 || t[i-1]!=2) g[i]+=g[i-1]; } if (!p) p=-1; for (int i=1;i<n;i++) for (int j=1;j<10;j++) ans+=p*f[i][j]; for (int i=1;i<t[n];i++) ans+=p*f[n][i]; ans+=p*g[n]; } int main() { while (scanf("%d%d",&a[0],&a[1])!=EOF) { if (!a[0] && !a[1]) break; a[0]--;ans=0; solve(0);solve(1); printf("%d\n",ans); } return 0; }
This passage is made by MashiroSky.