サブセットのシーケンス(判読不能)
件名の説明:
集計アンを考える= {1、2、...、N}。例えば、A1 = {1}、A3 = {1,2,3}。サブセットシーケンスは、非空部分集合のアレイとして定義されます。ソート辞書編集順にアンのすべてのサブセットsequece。あなたの仕事は、m番目のものを見つけることです。
入力
入力は、いくつかのテストケースが含まれています。各テストケースは、2つの数nとmで構成され(0 <N <= 20、0 <M <=アンのサブセットシーケンスの総数)。
出力
各テストケースに対しては、出力は、1つのラインのアンのm番目のサブセットシーケンスべきです。
サンプル入力
1 1 2 1 2 2 2 3 2 4 3 10
サンプル出力
1 1 1 2 2 2 1 2 3 1
その答えによって:
#include<stdio.h>
int main()
{
int n,i,group;
int s[21]; //每组首字母
__int64 m;
__int64 c[21]={0}; //每组个数
for(i=1;i<21;i++){
c[i]=(i-1)*c[i-1]+1;
}
while(scanf("%d%I64d",&n,&m)!=EOF){
for(i=0;i<21;i++){ //初始化首元素
s[i]=i;
}
while(n--&&m){
if (group= m / c[n+1] + ((m % c[n+1]) ? 1 : 0)) //计算组数
{
printf("%d", s[group]);
for (i = (int)group; i <= n; s[i]=s[i+1], i++); //删除首元素
m -= (group- 1) * c[i] + 1; //计算在第几个
if(m==0){
printf("\n");
}else{
printf(" ");
}
}
}
}
return 0;
}