数位dp,求助,样例都过不去
查看原帖
数位dp,求助,样例都过不去
291604
王茗仟楼主2023/2/17 11:27
#include<bits/stdc++.h>
#define double long double
#define int128 __int128
#define int long long
#define re register
#define in inline
#define Pi pair<int,int>
#define vi vector<int>
#define max(a,b)  ((a)>(b)?a:b)
#define min(a,b)  ((a)<(b)?a:b)
#define ls x<<1
#define rs x<<1|1
#define dx x+xx[i]
#define dy y+yy[i]
#define debug cout<<"wuyu"<<endl;
using namespace std;
const int INF=0x3f3f3f3f3f;
const int N=1e5+19;
const int M=1e6+10;
const int mod=998244353;
const double eps=1e-5;
in int read(){	re int x=0,f=0;re char c=getchar();	while(!isdigit(c)) f|=(c=='-'),c=getchar();	while(isdigit(c))  x=(x<<3)+(x<<1)+c-'0',c=getchar();	return f?-x:x;}
in void write(re int x){	if(x<0) putchar('-'),x=-x;	if(x>9) write(x/10);	putchar(x%10+'0');}


int n,m;
int l,r,b;
int a[101];
void init(){
	a[0]=0;
}
int f[101][1025][2][10];

int dfs(int less,int dep,int now,int sign){
	if(dep==0) return now==0&&sign==1;
	if(less==1) if(~f[dep][now][sign][b]) return f[dep][now][sign][b];
	int ed=less?(b-1):a[dep];
	int ret=0;
	for(int i=0;i<=ed;i++){
		if(i==0) sign=sign;
		else sign=1;
		ret+=dfs((less)||(i<ed),dep-1,now^(1<<i),sign);
	}
	if(less==1) f[dep][now][sign][b]=ret;
	return ret;
}

int work(int x){
	init();
	while(x){
		a[++a[0]]=x%b;
		x/=b;
	}
	return dfs(0,a[0],0,0);
}


signed main(){
	memset(f,-1,sizeof(f));
	int T;
	T=read();
	while(T--){
		b=read();l=read();r=read();
		cout<<work(r)-work(l-1)<<endl;
	}
}

















2023/2/17 11:27
加载中...