Luogu-3413 SAC#1

吐槽一下自己代码里长的一匹的状态...

(f[1000][10][10][2][2][2][2])分别记录当前位,前一位值,前前位值,是否有前导零,是否前一个有前导零,是否有上限,是否已经满足条件

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e3+100,P=1e9+7;
int a[maxn],b[maxn],f[maxn][10][10][2][2][2][2],num;
char s[maxn];
void read(int *x){
	scanf("%s",s+1);
	x[0]=strlen(s+1);
	for(int i=1,L=strlen(s+1);i<=L;i++)
		x[i]=s[L-i+1]-'0';
}
int dfs(int *c,int wei,int last,int bef,int qdl,int bdl,int xz,int ok){
	if(wei==0) return ok;
	int &ans=f[wei][last][bef][qdl][bdl][xz][ok],lim=xz?c[wei]:9;
	if(ans) return ans;
	for(int i=0;i<=lim;i++){
		int p=0;
		if((!qdl&&last==i)||(!bdl&&bef==i))
			p=1;
		ans+=dfs(c,wei-1,i,last,qdl&&!i,qdl,xz&&i==lim,ok|p);
		ans%=P;
	}
	return ans;
}
inline int work(int *c){
	memset(f,0,sizeof(f));
	return dfs(c,c[0],0,0,1,1,1,0);
}
int main(){
	read(a),read(b);
	for(int i=1;i<=a[0];i++)
		if(a[i]==0) a[i]=9;
		else{
			a[i]--;
			if(!a[i]&&i==a[0]) a[0]--;
			break;
		}
	printf("%d
",(work(b)-work(a)+P)%P);
	return 0;
}
原文地址:https://www.cnblogs.com/nianheng/p/9921537.html