求助,正着跑跟倒着跑有什么区别?
查看原帖
求助,正着跑跟倒着跑有什么区别?
323284
nvqlfi214楼主2023/11/8 10:37

我一开始是正着跑的,然后第三个点就 WA 了。

后来倒着跑了之后就过了???

(难道是我 reverse 用错了???)

这是代码:

//注释掉的是原来的错误的方向
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll read(){
	char ch=getchar();
	ll x=0;
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x;
}
int dig[80],len,b;
ll f[11][80][1<<10];
ll dfs(int p,int sta,int les,int nz){
	if(!p)return !sta;
  //if(p==len+1)
	if(les&&nz&&f[b][p][sta]!=-1)return f[b][p][sta];
	ll res=0;
	int y;
	if(!les)y=dig[p];
	else y=b-1;
	for(int i=0;i<=y;i++)
		res+=dfs(p-1,(nz||i)?(sta^(1<<i)):0,i<dig[p]||les,nz||i);
  //p+1
	if(les&&nz)f[b][p][sta]=res;
	return res;
}
ll solve(ll x){
	len=0;
	while(x){
		dig[++len]=x%b;
		x/=b;
	}
  //reverse(dig+1,dig+len+1);
	return dfs(len,0,0,0);
  //return dfs(1,0,0,0);
}
#define endl '\n'
int main(){
	int T=read();
	memset(f,-1,sizeof(f));
	while(T--){
		b=read();
		ll l=read()-1,r=read();
		cout<<solve(r)-solve(l)<<endl;
	}
	return 0;
}
2023/11/8 10:37
加载中...