题解:CF2086E Zebra-like Numbers
我们发现,最多只有
我们设从小到大第
我们设
同时,我们发现若有
那么我们不妨把
#include<bits/stdc++.h>
using namespace std;
#define int long long
int l,r,k;
int t[40],dp[40][2][90][2],dig[40];
int dfs(int pos,bool limit,int sum,bool limit2){
if(sum>k) return 0;
if(pos==0) return sum==k;
if(dp[pos][limit][sum][limit2]!=-1) return dp[pos][limit][sum][limit2];
int up;
if(limit2) up=0;
else if(limit) up=dig[pos];
else up=4;
int ans=0;
for(int i=0;i<=up;i++){
ans+=dfs(pos-1,(limit&&i==up),sum+i,(limit2||i==4));
}
return dp[pos][limit][sum][limit2]=ans;
}
int solve(int x){
memset(dp,-1,sizeof dp);
int cnt=30;
for(int i=30;i>=1;i--){
dig[i]=0;
while(x>=t[i]) x-=t[i],dig[i]++;
}
return dfs(30,1,0,0);
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
t[1]=1;for(int i=2;i<=30;i++) t[i]=4*t[i-1]+1;
int T;cin>>T;while(T--){
cin>>l>>r>>k;
cout<<solve(r)-solve(l-1)<<endl;
}
return 0;
}