1 solutions

  • -1
    @ 2024-6-4 17:46:09

    预处理+枚举子集(10210)(10*2^{10})

    预先计算30,31,32...3103^0,3^1,3^2...3^{10},通过组合出所有的可能的情况

    #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;
    }
    

    二进制

    选择3i3^i就表示二进制的第ii选了

    原始数据 二进制 二进制对应10进制
    303^0 1
    313^1 10 2
    31+303^1+3^0 11 3
    323^2 100 4
    32+303^2+3^0 101 5

    由此可见可以将nn的二进制得到,然后得到原始数据

    #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