USACO 3.2 Stringsobits
来源:互联网 发布:河南人 知乎 编辑:程序博客网 时间:2024/04/30 06:14
http://www.cppblog.com/yuziyu/archive/2009/07/03/89191.html
首先计算出组合数。用cmb_num[i][j]表示i位数中,"1的位数小于等于j"的数的个数。
这样,我们从最左边开始,如果cmb_num[i-1][j]的数大于n,说明第一位为0,因为用i-1位数中"1的位数小于等于j"的数已经大于n个了。
如果小于n,说明第一位为1,需要i位,才能使"1的位数小于等于j"的数大于n个了。既然第一位已经是1了,接下来的i-1位组成的数的1的个数只能小于等于n-1位了。迭代输出每一位即可。
只是要注意溢出的问题以及cmb_num[0][1]。
#include <iostream>#include <fstream>using namespace std;ifstream fin("kimbits.in");ofstream fout("kimbits.out");#ifdef _DEBUG#define out cout#define in cin#else#define out fout#define in fin#endifunsigned int cmb_num[32][32];void build_cmb_num(){ for(int i=0;i<32;++i) cmb_num[i][0] = 1; for(int i=1;i<32;++i) for(int j=1;j<=i;++j) cmb_num[i][j] = cmb_num[i-1][j-1]+cmb_num[i-1][j]; for(int i=0;i<32;++i) for(int j=1;j<32;++j){ cmb_num[i][j]+=cmb_num[i][j-1]; }}void solve(){ build_cmb_num(); unsigned n,l,i; in>>n>>l>>i; for(unsigned idx=n;idx>0;--idx){ if( i> cmb_num[idx-1][l] ){ out<<1; i-=cmb_num[idx-1][l]; l--; }else{ out<<0; } } out<<endl;}int main(int argc,char *argv[]){ solve(); return 0;}
- USACO 3.2.2 stringsobits
- USACO 3.2.2 Stringsobits
- USACO 3.2 Stringsobits
- USACO Section 3.2 Stringsobits
- USACO 3.2 Stringsobits (kimbits)
- USACO 3.2.2:Stringsobits
- usaco 3.2.3 stringsobits
- USACO Section 3.2 PROB Stringsobits
- USACO Section 3.2 Stringsobits - 排列组合
- USACO-Section 3.2-PROB Stringsobits
- USACO Stringsobits
- usaco Stringsobits
- usaco Chapter 3 section 3.2 Stringsobits
- USACO section 3.2 Stringsobits(组合数学)
- USACO-Section 3.2 Stringsobits(DP)
- 【动态规划】【USACO】Stringsobits
- USACO Stringsobits, DP
- USACO Stringsobits 解题报告
- 图像解码之一:使用libjpeg解码jpeg图片
- 用汇编的眼光看C++(之嵌入汇编) ,(之特殊函数)
- hduoj2042,不容易系列之二,递推水题
- linux 进程(关于守护进程、检查一个进程是否活着、如何写一个进程号文件)
- linux sed
- USACO 3.2 Stringsobits
- JavaScript面试题
- 用汇编的眼光看C++(之class构造、析构) ,(之拷贝、赋值函数)
- ok6410-第06篇-裸机led程序
- java itext html转pdf[续篇]
- linux awk
- UML ----用例图
- C#上机 第七周 任务2 判断该物体是否会在水中下沉
- Struts2基础之八:action的缺省配置和包含其他配置文件