hdu(2062)-Subset sequence 组合数学
2015-07-21 17:15
211 查看
意甲冠军:查找集合{1,2,3...n}第一m一个排列子。
收集的线索所行的大小。
例两个元素的排列子集合按字典树排列是:{1},{1,2},{2},{2,1};
解法:一个一个元素来确定,每次把剩余的元素按大小顺序排列在num中,然后依据排列组合原理直接计算下一个位置的元素的大小。直到排列数为0停止;
代码:
收集的线索所行的大小。
例两个元素的排列子集合按字典树排列是:{1},{1,2},{2},{2,1};
解法:一个一个元素来确定,每次把剩余的元素按大小顺序排列在num中,然后依据排列组合原理直接计算下一个位置的元素的大小。直到排列数为0停止;
代码:
/****************************************************** * author:xiefubao *******************************************************/ #pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <vector> #include <algorithm> #include <cmath> #include <map> #include <set> #include <stack> #include <string.h> //freopen ("in.txt" , "r" , stdin); using namespace std; #define eps 1e-8 const double pi=acos(-1.0); typedef long long LL; const int Max=21; const int INF=1000000007; LL A[Max][Max]; LL sum[Max]; void init() { for(int i=0; i<Max; i++) for(int j=0; j<=i; j++) A[i][j]=j?A[i-1][j-1]*j+A[i-1][j]:1; for(int i=0; i<Max; i++) for(int j=0; j<=i; j++) sum[i]+=A[i][j]; } int n; LL m; int num[Max]; int main() { init(); while(scanf("%d%I64d",&n,&m)==2) { for(int i=1; i<=n; i++) num[i]=i; int len=n; int t=(m-1)/sum[len-1]+1; printf("%d",num[t]); m-=(t-1)*sum[len-1]+1; for(int k=t; k<=len-1; k++) num[k]=num[k+1]; len--; while(m) { int t=(m-1)/sum[len-1]+1; printf(" %d",num[t]); m-=(t-1)*sum[len-1]+1; for(int k=t; k<=len-1; k++) num[k]=num[k+1]; len--; } puts(""); } return 0; }
相关文章推荐
- 设计模式-建造者模式(Builder)
- EasyUI-初级使用
- EasyUI-初级使用
- 10.根据主类,完成Compare类,该类有两个boolean类型的方法,方法isSameNum用来比较两组数是否完全相同,方法isSameSum用来比较两组数的和是否相等。相同或者相等返回true,
- iOS 自定义UISlider
- duilib中添加自定义控件之后怎么能够在xml文件中配置使用
- Leetcode #62 Unique Paths
- iOS UIView和CATransition的动画实现
- Android_UI开发详解之ActionBar
- POJ-1458-Common Subsequence-动规最长公共子序列
- request.getContextPath()
- UISlider 属性
- 50 Excel VBA Oral Interview Questions
- java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
- HDU 2818 Building Block(带权并查集)
- PAT 1051. Pop Sequence (25)
- 在pcDuino下编译安装openCV的问题
- ArrayBlockingQueue跟LinkedBlockingQueue的区别
- 【第四篇章-android平台MediaCodec】解决Observer died. Quickly, do something, ... anything...
- LinkedBlockingQueue的put,add跟offer的区别