#include<bits/stdc++.h>
using namespace std;
const int N=35;
int l,r,K,B;
int f[N][N];//f[i][j]代表i个中选j个的组合数
void init(){
for(int i=0;i<N;i++)
for(int j=0;j<=i;j++){
if(!j)f[i][j]=1;
else f[i][j]=f[i-1][j]+f[i-1][j-1];//组合数递推公式
}
}
int dp(int x){
if(!x)return 0;
vector<int>num;
while(x){num.push_back(x%B);x/=B;}
int k=0;
long long ans=0;
for(int i=num.size()-1;i>=0;i--){
if(num[i]==1){ans+=f[i][K-k];k++;}//当i位为0时的组合数
else if(num[i]>1){ ans+=f[i+1][K-k];break;}
if(k>K)break;
if(i==0&&K==k){ans++;break;}
}
//cout<<ans<<endl;
return ans;
}
int main(){
cin>>l>>r>>K>>B;
init();
cout<<dp(r)-dp(l-1)<<endl;
return 0;
}
AcWing 1081. 度的数量
最新推荐文章于 2024-11-11 23:32:39 发布