题目大意
有N个将领,每个将领的编号依次为1、2、3……N,第i个将领的武力值为3^(i-1)。
可以任选一些将领,他们的武力值之和就是总武力值
给出n组数据,每组数据有一个k,求第k大的总武力值
题目大意
首先,可以发现这是一个等比数列,第1项为1,公比为3
根据等比数列的公式可以求出第i项的值为3i-1,以及1~i-1项的和为3n-1-1/2
由此可得第i项的值大于1~i-1项的和
所以可以把k转化为二进制后,把它当作三进制转化为十进制就是结果了
代码
#include<bits/stdc++.h>
using namespace std;
long long n,k,ans,ss;
ifstream fin("recruitment.in");
ofstream fout("recruitment.out");
int main()
{
fin>>n;
while(n--)
{
fin>>k;
ss=1;
ans=0;
while(k>0)
{
if(k&1) ans+=ss;
ss*=3;
k>>=1;
}
fout<<ans<<endl;
}
}