大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
求给定区间 [X,Y] 中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和。
例如,设 X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意:
17=24+20
18=24+21
20=24+22
输入格式
第一行包含两个整数 X 和 Y,接下来两行包含整数 K 和 B。
输出格式
只包含一个整数,表示满足条件的数的个数。
数据范围
1≤X≤Y≤231−1,
1≤K≤20,
2≤B≤10
输入样例:
15 20
2
2
输出样例:
3
#include<bits/stdc++.h>
using namespace std;
const int N = 1e2 + 10;
const int K = 35;
//[1 - X]
int res = 0;
int f[K][21];
int l,r,k,b;
void init(){
for(int i = 0;i < K;i ++){
for(int j = 0;j <= i && j < 21;j ++)
if(!j)f[i][j] = 1;
else f[i][j] = f[i - 1][j - 1] + f[i - 1][j];
}
}
int dp(int x){
if(!x)return 0;
vector<int>nums;
while(x)nums.push_back(x % b),x /= b;
int res = 0;
int last = k;
for(int i = nums.size() - 1;i >= 0;i --){
int x = nums[i];
if(last < 0 || last > i + 1)break;
if(x > 1){
if(i >= last)res += f[i][last];
if(i >= last - 1)res += f[i][last - 1];
}
else if(x == 1){
if(i >= last)
res += (f[i][last]);
}
if(x > 1)break;
if(x == 1)last --;
if(!i && last == 0)res ++;
}
return res;
}
int main(){
init();
cin>>l>>r>>k>>b;
cout<<(dp(r) - dp(l - 1))<<endl;
return 0;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/169086.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...