题目来源:数列
题目描述
给定一个正整数k,把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:
1,3,4,9,10,12,13,…
该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…
请你求出这个序列的第N项的值(用10进制数表示)。
例如,对于k=3,N=100,正确答案应该是981。
输入格式
输入文件只有1行,为2个正整数,用一个空格隔开:k N。
输出格式
输出文件为计算结果,是一个正整数(在所有的测试数据中,结果均不超过2.1∗109)。(整数前不要有空格和其他符号)。
数据范围
3≤k≤15,
10≤N≤1000
输入样例:
3 100
输出样例:
981
思路
我们直接求出所有的序列,在排个序,然后得到第n个,貌似也可以
但是y总给出了一个很标准的做法,二进制+映射
我理解是:
我们看一个二进制数字:10=1010-> 10=1 * 23+0 * 22+1 * 21+0 * 20
显然大于 9=1001-> 9=1 * 23+0 * 22+0 * 21+01* 20
也就是说 以2为底的序列的大小关系和二进制数的大小关系一致的
那么是否以任意数k为底的序列的大小关系和二进制数的大小关系一致呢?
我们不加证明的指出是一致的,证明可以查看 这里
那么这题就简单了 我们先将n转换成二进制数,然后求出他在k为底的序列下的值就是结果了
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int get(int k,int i)
{
int res=1;
while(i--) res*=k;
return res;
}
int main()
{
int n,k;
cin>>k>>n;
LL res=0;
for(int i=0;i<10;i++) //n最大是1000 而2^10>1000了 所以我们枚举到9就好了
{
if(n>>i & 1) res+=get(k,i);
}
cout<<res<<endl;
}