考前太焦虑了。。想8出题,就来写板子吧。去年列的目录找不到了,重新列了一个。感觉不是很全,代码一点点填吧,,拜托各位大佬在下方补充目录啊~也可以帮助一下读到这篇笔记的人$qwq$。
PS:这个板子用博客园的代码插入是真的丑,不过没时间修板子了。。。凑合用吧。。。。
成功不必在我,而功力必不唐捐。
算法
数位dp
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 #include<queue> 7 #include<set> 8 using namespace std; 9 typedef long long ll; 10 11 ll read() { 12 ll x = 0,f = 1;char c = getchar(); 13 while(c < '0' || c > '9') { 14 if(c == '-') f = -1;c = getchar(); 15 } 16 while(c >= '0' && c <= '9') { 17 x = x * 10 + c - '0';c = getchar(); 18 } 19 return x * f; 20 } 21 int a[12],f[12][10][2],cnt;//f[i][j][k]表示前i位,第i - 1位为j,是(1)否(0)有限制的方案数 22 int dfs(int pos,int lst,int lim) { 23 if(pos == 0) return 1; 24 if(f[pos][lst][lim] != -1) return f[pos][lst][lim]; 25 int ret = 0; 26 int k = 9; 27 if(lim) k = a[pos]; 28 for(int i = 0;i <= k;++i) { 29 if(i == 4 || (lst == 6 && i == 2)) continue; 30 ret += dfs(pos - 1,i,lim && (i == k)); 31 } 32 return f[pos][lst][lim] = ret; 33 34 } 35 int solve(int x) { 36 memset(f,-1,sizeof(f)); 37 cnt = 0; 38 while(x) { 39 a[++cnt] = x % 10; 40 x /= 10; 41 } 42 return dfs(cnt,0,1); 43 } 44 int main() { 45 while(1) { 46 int l = read(),r = read(); 47 if(!l && !r) return 0; 48 printf("%d\n",solve(r) - solve(l - 1)); 49 } 50 return 0; 51 }