数位DP水题求助
查看原帖
数位DP水题求助
938212
OMG_NOIP楼主2024/4/1 16:08

只有10pts

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll MOD=1e9+7;
ll upp[1005],dp[1005][13][13];
ll dfs(ll p,ll lst1,ll lst2,bool op,bool apr_0,bool limit){
	if(p<=0)return op;
	if(!limit&&lst1>=0&&lst2>=0&&dp[p][lst1][lst2]!=-1)return dp[p][lst1][lst2];
	ll upper=limit?upp[p]:9,res=0;
	for(ll i=0;i<=upper;i++)
		(res+=dfs(p-1,lst2,(!(apr_0||i!=0)?-1:i),op||(i==lst1)||(i==lst2),apr_0||(i!=0),limit&&(i==upp[p])))%MOD;
	if(!limit)dp[p][lst1][lst2]=res;
	return res;
}
ll work(string s){
	ll tot=0;
	for(ll i=s.size()-1;i>=0;i--)upp[++tot]=(ll)(s[i]-'0');
	if(upp[tot]==0)tot--;
//	cout<<"upp : ";for(ll i=tot;i>=1;i--)cout<<upp[i]<<" ";cout<<endl;
	memset(dp,-1,sizeof(dp));
	return dfs(tot,-1,-1,false,false,true);
}
signed main(){
	ios::sync_with_stdio(false);
	string a,b;cin>>a>>b;
	a[a.size()-1]--;
	ll asd=a.size()-1;
	while(a[asd]<'0'){
		a[asd]='9';
		a[--asd]--;
	}
//	cout<<"a = "<<a<<"   b = "<<b<<endl;
	cout<<(((work(b)-work(a))%MOD)+MOD)%MOD;
	return 0;
} 
2024/4/1 16:08
加载中...