70求调
查看原帖
70求调
766436
Mr_RedStone楼主2025/1/4 16:53

用了 lead 判断是否存在前导零,lead=1 表示有前导零,flag 是有没有到达上限。

#include<bits/stdc++.h>
using namespace std;
int a[25];
long long f[15][10][10][2][2][2];
long long dfs(int step,bool flag,bool lead,int l1,int l2,bool f8,bool f4,bool con){
	if(f8&&f4) return 0;
	if(step<1) return con;
	if(!flag&&!lead&&f[step][l1][l2][f8][f4][con]!=-1) return f[step][l1][l2][f8][f4][con];
	long long cnt=0;
	int up=flag?a[step]:9;
	for(int i=0;i<=up;i++){
		if(f8&&i==4) continue;
		if(f4&&i==8) continue;
		cnt+=dfs(step-1,flag&&(i==up),lead&&(i==0),i,l1,f8||(i==8),f4||(i==4),con||(!lead&&i==l1&&i==l2));
	}
	if(!flag&&!lead) f[step][l1][l2][f8][f4][con]=cnt;
	return cnt;
}
long long solve(long long x){
	memset(f,-1,sizeof(f));
	int sz=0;
	while(x){
		a[++sz]=x%10;
		x/=10;
	}
	if(sz!=11) return 0;
	return dfs(sz,1,1,0,0,0,0,0);
}
int main(){
	long long x,y;
	scanf("%lld %lld",&x,&y);
	printf("%lld",solve(y)-solve(x-1));
	return 0;
}
2025/1/4 16:53
加载中...