题意:求区间内有多少个数满足条件:任意相邻的k个数位都不相等。
思路:老套路
#include<bits/stdc++.h> using namespace std; typedef long long ll; int bit[24]; ll dp[24][11][11][11][11][6]; bool mycheck(int p[], int k, int newin) { for(int i = 0; i < k - 1;i ++) if(p[i] == newin) return false; return true; } ll dfs(int now, int p[], int k, bool flag) { if(now <= -1) return 1; if(!flag && dp[now][p[0]][p[1]][p[2]][p[3]][k] != -1) return dp[now][p[0]][p[1]][p[2]][p[3]][k]; int step = flag ? bit[now] : 9; ll ret = 0; for(int i = 0; i <= step; i ++) { if(mycheck(p, k, i)){ int newp[4]; if(i == 0 && p[0] == 10){ newp[0] = newp[1] = newp[2] = newp[3] = 10; }else{ newp[3] = p[2];newp[2] = p[1]; newp[1] = p[0];newp[0] = i; } ret += dfs(now - 1, newp, k, flag && (i == step)); } } if(!flag) dp[now][p[0]][p[1]][p[2]][p[3]][k] = ret; return ret; } ll solve(ll n, int k){ if(n == 0) return 1; int cnt = 0; while(n){ bit[cnt ++] = n % 10; n /= 10; } int p[] = {10, 10, 10, 10}; return dfs(cnt - 1, p, k, true); } int main(){ ll l, r; int k; memset(dp, -1, sizeof(dp)); while(~scanf("%lld%lld%d", &l, &r, &k)){ printf("%lld ", solve(r, k) - solve(l - 1, k)); } return 0; }