1 solutions
-
-1
预处理+枚举子集
预先计算,通过组合出所有的可能的情况
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int M=15; LL b[M]; //b[i]等于b的k次方 vector<LL> v; int main() { int k,N; cin>>k>>N; b[0]=1; int n=10; for(int i=1;i<=n;i++) //计算k的次方 { b[i]=b[i-1]*k; } for(int i=1;i<1<<n;i++) //枚举所有的选项 { LL s=0; for(int j=0;j<n;j++) //枚举当前选择的选择 { if(i>>j&1) { s+=b[j]; } } v.push_back(s); //放入数组之中 } sort(v.begin(),v.end()); //排序 cout<<v[N-1]; return 0; }
二进制
选择就表示二进制的第选了
原始数据 二进制 二进制对应10进制 1 10 2 11 3 100 4 101 5 由此可见可以将的二进制得到,然后得到原始数据
#include<bits/stdc++.h> using namespace std; int main() { int n,k; cin>>k>>n; int res=0,p=1; for(int i=0;i<=10;i++) { if(n>>i&1) //当前k^i次方选了 { res+=pow(k,i); } } cout<<res; return 0; }
- 1
Information
- ID
- 416
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 9
- Tags
- # Submissions
- 10
- Accepted
- 5
- Uploaded By