【6.12校內test】T2 子集

這道題大概是這三道題裏最簡單的啦c++

但這阻止不了我廢的腳步spa


【問題描述】 對於 n=4 時,對應的集合 s={4,3,2,1},他的非空子集有 15 個依次以下:code

{1} {2} {1,2} {3} {1,3} {2,3} {1,2,3} {4} {1,4} {2,4} {1,2,4} {3,4} {1,3,4} {2,3,4} {1,2,3,4};blog

當 n=4 時,集合{4,3,2,1}的 15 個子集分別對應於 4 位二進制數:it

{1}:0001;{2}:0010;{1,2}:0011;{3}:0100,…,{1,2,3,4}:1111。class

把二進制數相對應的十進制數的 1,2,3,…,15 分別做爲相應集合的編號。循環

如子集{1,2,4}對應的二進制數是 1011,相應的十進制數是 11,因此子集{1,2,4}的編號 爲 11。二進制

任務: 對於給定的 n 和 m,輸出集合{1,2,…,n}的編號爲 m 的子集。數據

【輸入格式】集合

n,m

【輸出格式】

集合的第 m 個子集的元素,元素從小到大輸出,中間一個空格隔開。

【樣例輸入】

4 11

【樣例輸出】

1 2 4

【數據範圍及約定】 100%的數據:n<=20,m<=2^n-1。


對於這個題,我仍是遊刃有餘的,畢竟個人特長就是寫循環嘛【燦爛】

其實感受n壓根沒有什麼用處,只須要把輸入的數m轉化成二進制看對應哪一位就好啦;

由於深受以前快速冪的影響,我是用「&」作的:

#include<bits/stdc++.h>

using namespace std;

int n,m,cnt,a[100];

int main(){
    scanf("%d%d",&n,&m);
    while(m){
        if(m&1) a[++cnt] = 1;
        else a[++cnt] = 0;
        m>>=1;
    }
    
    for(int i=1;i<=cnt;i++) if(a[i]) cout<<i<<" ";
    return 0;
}

嗯,沒有了;

相關文章
相關標籤/搜索