這道題大概是這三道題裏最簡單的啦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; }
嗯,沒有了;