我一开始是正着跑的,然后第三个点就 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;
}