数位DP求调
查看原帖
数位DP求调
763878
Jerry_heng楼主2024/11/28 08:29
//2024-11-28 07:58:15
#include<bits/stdc++.h>
#define db double
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define mkp make_pair
#define pii pair<int,int>
using namespace std;
bool MBE;
inline int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-f;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f; 
}
int a[21],dp[21][2010];
int dfs(int pos,int s,int be,int tp){
	if(!pos)return __builtin_popcount(s&(s^1))<=3;
	if(!be&&!tp&&dp[pos][s]!=-1)return dp[pos][s];
	int mx=tp?a[pos]:9,res=0;
	for(int i=0;i<=mx;i++){
		res+=dfs(pos-1,(be&&!i)?0:(s|(1<<i)),be&&!i,tp&&(i==mx));
	}
	if(!be&&!tp)dp[pos][s]=res;
	return res;
}
int query(int x){
	int cnt=0;
	while(x){
		a[++cnt]=x%10;
		x/=10;
	}
	return dfs(cnt,0,1,1);
}
signed main(){
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    int T=read();
    memset(dp,-1,sizeof dp);
    while(T--){
    	int l=read(),r=read();
    	printf("%lld\n",query(r)-query(l-1));
    }
    bool MED;
    cerr<<(&MED-&MBE)/1048576.0<<" MB, "<<1000*clock()/CLOCKS_PER_SEC<<" ms\n";
    return 0;
}
2024/11/28 08:29
加载中...