救救孩子吧!玄关
查看原帖
救救孩子吧!玄关
563663
xu222ux楼主2024/1/28 21:23

样例都过不了。。。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
string l,r;
int s[1003];
int lenl,lenr,len;
int f[1003][10][10];
int dfs(int i,int j,int k,bool flag,bool op){
	if(i==0)return (!op);
	if(j!=-1&&k!=-1&&f[i][j][k]!=-1&&!flag&&!op)return f[i][j][k];
	int up;
	if(flag)up=s[i];
	else up=9;
//	cout<<up<<' ';
	int ans=0;
	for(int p=0;p<=up;p++){
		if(p!=j&&p!=k&&!op){
			ans=(ans+dfs(i-1,p,j,p==up&&flag,false))%mod;
		}else if(op){
			ans=(ans+dfs(i-1,i==0?-1:i,-1,p==up&&flag,i==0))%mod;
		}
	}
//	cout<<i<<' '<<j<<' '<<k<<' '<<flag<<' '<<op<<' '<<ans<<endl;
	f[i][j][k]=ans;
	return ans;
}
signed main(){
	cin>>l>>r;
	lenl=l.size(),lenr=r.size();
	for(int i=lenl-1;i>=0;i--){
		if(l[i]!='0'){
			l[i]--;
			break;
		}else{
			l[i]='9';
		}
	}
	if(l[0]=='0'&&lenl!=1){
		for(int i=1;i<lenl;i++){
			l[i-1]=l[i];
		}
		lenl--;
	}
	int ansr,ansl;
	memset(f,-1,sizeof(f));
	len=lenr;
	for(int i=0;i<len;i++){
		//cout<<r[i];
		s[len-i]=r[i]-'0';
	}
	//for(int i=1;i<=len;i++)cout<<s[i];
	//cout<<endl;
	ansr=dfs(len,-1,-1,true,true);
	memset(f,-1,sizeof(f));
	len=lenl;
	for(int i=0;i<len;i++){
		s[len-i+1]=l[i]-'0'; 
	}
	ansl=dfs(len,-1,-1,true,true);
	int lans=0,rans=0;
	for(int i=0;i<lenl;i++){
		lans=((lans*10)%mod+(l[i]-'0'))%mod;
	}
	for(int i=0;i<lenr;i++){
		rans=((rans*10)%mod+(r[i]-'0'))%mod;
	}
	//cout<<"=-====-\n";
	//cout<<ansl<<' '<<ansr<<endl;
	cout<<(rans-lans-(ansr-ansl+mod)%mod+mod)%mod;
	return 0;
}
2024/1/28 21:23
加载中...