[U]3.2.2 Stringsobits 组合,递推

php中文网
发布: 2016-06-07 15:38:53
原创
1253人浏览过

很快就发现了这题的递推特性。简直是赤裸裸啊~ 定义一个数组( [串长度][串中'1'的个数]=种类数 )这就是一个排列啊~ 用一个简单的递推方程求解出来C(n,i)=C(n-1,i)C(n-1,i-1); 然后从首位n开始判断,∑C[n-1][i] ( i∈[0,l] ) 若和大于等于当前的第k个数则说明

很快就发现了这题的递推特性。简直是赤裸裸啊~

定义一个数组(  [串长度][串中'1'的个数]=种类数  )这就是一个排列啊~

用一个简单的递推方程求解出来C(n,i)=C(n-1,i)+C(n-1,i-1);

然后从首位n开始判断,∑C[n-1][i] ( i∈[0,l] )

若和大于等于当前的第k个数则说明,右边的n-1位足够提供题中所需的数量,因此当前位为'0';

若右边n-1位不能提供所需的数量,则当前位为'1',右边必须向n借一位,这样k-=cnt;把右边的和减去。提供的l--;

蛮有意思的一题:

Code:

/*
ID:bysen
LANG:C++
PROG:kimbits
*/
#include<stdio.h>
using namespace std;

int C[32][32];

int main()
{
 	freopen( "kimbits.in","r",stdin );
 	freopen( "kimbits.out","w",stdout );
 	int n,l;
	long long k;
 	scanf( "%d %d %lld",&n,&l,&k );
 	for( int i=0;i<32;i++ )
 	for( int j=0;j<32;j++ )
 		 C[i][j]=0;
	
	for( int i=0;i<32;i++ )
		 C[i][0]=1;
		 
	for( int i=1;i<32;i++ )
	for( int j=1;j<32;j++ )
		 C[j][i]=C[j-1][i]+C[j-1][i-1];
		 
	for( int i=n;i>=1;i-- )
	{
	 	 int cnt=0;
	 	 for( int j=0;j<=l;j++ )
	 	 	  cnt+=C[i-1][j];
	 	 if( cnt<k )
	 	 {
		  	 k-=cnt;l--;
	 	 	 printf( "1" );
         }
         else
         {
		  	 printf( "0" );
  	     }
    }
    printf( "\n" );
 	return 0;
}
登录后复制


最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号