习题10-21 二项式系数 UVa1649

1.题目描述:点击打开链接

2.解题思路:本题利用枚举+二分解决。问题的关键是选对枚举对象,因为要找C(n,k)=m,如果枚举n的话,一旦m非常大,枚举n就会十分困难。因此枚举对象应为k。根据组合数的性质易知,C(n,n/2)时是最大值,C(n,1)是最小值。由于固定的是k,因此n=2*k时是最小的范围,n=m是最大的范围,这样,即可通过二分法来寻找n。

本题有一个技巧,即在计算组合数时候,不必完整的计算完毕,只要发现中间已经超过了m,说明这个n肯定不是解,返回m+1即表示无解。

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;

#define pll pair<long long,long long>
#define M(a,b) make_pair(a,b)

using namespace std;
priority_queue<pll, vector<pll >, greater<pll > >q;
long long m;
long long c(int k, long long n)
{
	int i;
	long long f = 1;
	for (i = 1; i <= k; i++)
	{
		if ((f / i)>(m / (n - i + 1)))//如果发现算到第i步时结果已经超过m了,说明n肯定不是解,返回一个m+1
			return m + 1;
		f *= (n - i + 1);
		f /= i;
	}
	return f;
}
void chk()
{
	long long l, r, mid, t;
	int k;
	for (k = 1; c(k, 2 * k) <= m; k++)//最小的范围是C(k,2*k)
	{
		l = k * 2;
		r = m;
		while (l <= r)
		{
			mid = (l + r) >> 1;
			t = c(k, mid);
			if (t == m)
			{
				q.push(M(mid, k));
				if (mid == k * 2) break;
				q.push(M(mid, mid - k));
				break;
			}
			else if (t<m)
				l = mid + 1;
			else
				r = mid - 1;
		}
	}
}
int main()
{
	//freopen("t.txt", "r", stdin);
	int n, i;
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		cin >> m;
		chk();
		if (q.size())
		{
			printf("%d\n", q.size());
			int len = q.size();
			for (int i = 0; i < len; i++)
			{
				printf("(%lld,%lld)%c", q.top().first, q.top().second, i == len - 1 ? '\n' : ' ');
				q.pop();
			}
		}
		else
			puts("0\n");
	}
	return 0;
}
时间: 2024-10-19 09:51:47

习题10-21 二项式系数 UVa1649的相关文章

Daily Scrum 10.21

然后由于服务器端有变化,另外具体IDE已经确定,接下来对已经分配下去的任务做些细节补充: 10.20日晚所有人必须完成AS的配置,统一版本为1.3.2,安卓版本为4.4.0,可视化界面手机为Nexus6.并且上网搜寻AS的教程,了解IDE的布局,各个模块的用处. 今晚林珣玙.仇栋民.刘彦熙必须整理完Bmob平台的开发者文档,下载完SDK.对Bmob的整体工作流程,如何和安卓开发联系这两方面内容了解清楚.另外刘彦熙今晚需要提前完成数据库的关系表设计,并在Bmob平台上建立合理名称的数据表.10.2

C语言程序设计教程(第三版)课后习题10.4

1353: C语言程序设计教程(第三版)课后习题10.4 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 296  Solved: 219[Submit][Status][BBS] Description 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图.写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数. Input 输入数据的个数n n个整数移动的位置m Output 移动后的n个数 Sample Input

同侪隐修录&#160;(2016-12-25 23:10:21)转载▼

同侪隐修录 (2016-12-25 23:10:21)转载▼ 标签: 武术史 武学 孙氏拳前辈多隐修者,不仅孙存周先生1949年后基本处于隐修状态,鲜与武术界往来,同辈中武艺高明者如裘徳元.齐公博等先生亦如是.这种隐修的气质在孙门内颇为普遍,及至我辈,同侪中之武艺高明者几乎皆如此,如董岳山.陈垣.牟八爷.驼五爷.肖德昌等,不一而足.即使是以票友自称的侪辈高手,如圆觉和尚.胡六爷.何回子.支一峰.刘子明等先生也是隐修自娱,鲜为人知.其他人如张兆麒.李梦庚.章仲华.关秉之.张烈等先生其为人大体也是此

Clover KextsToPatch 使用方法 2015.10.21

Clover KextsToPatch 使用方法 2015.10.21 前些天,因为 Thinkpad X230 BIOS 白名单限制,给她换了一块 ar9285 无线网卡,只是因为这块网卡正好可以被 Mac OS X 驱动,也正好在 Thinkpad X230 BIOS 白名单之中.给 Clover 配置的时候,为了防止忘记,便记录下来. 因为灵活使用 Clover 成为黑苹果用户的必修课,否则你就只能漫天寻找 kext,寄希望与运气能正确驱动你的硬件了.Clover 中有一个强大的功能 Ke

问题 1047: C语言程序设计教程(第三版)课后习题10.5

/******************************************************************** @file Main.cpp @date 2017-06-01 12:17:46 @author Zoro_Tiger @brief 问题 1047: C语言程序设计教程(第三版)课后习题10.5 http://www.dotcpp.com/oj/problem1047.html ***************************************

问题 1043: C语言程序设计教程(第三版)课后习题10.1

/******************************************************************** @file Main.cpp @date 2017-05-29 12:55:07 @author Zoro_Tiger @brief 问题 1043: C语言程序设计教程(第三版)课后习题10.1 http://www.dotcpp.com/oj/problem1043.html ***************************************

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21

七周五次课 10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 启动firewalld防火墙,关闭iptables 查看所有的zone和默认的zone 10.21 firewalld关于zone的操作 设置默认zone 设置网卡的zone 10.22 firewal

1046: C语言程序设计教程(第三版)课后习题10.4

题目描述 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数,见图.写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数. 输入 输入数据的个数n n个整数 移动的位置m 输出 移动后的n个数 样例输入 10 1 2 3 4 5 6 7 8 9 10 2 样例输出 9 10 1 2 3 4 5 6 7 8 1 #include <stdio.h> 2 #define N 100 3 4 // 移动一次 5 move(int a[], int n) 6 { 7 int

APUE 第三版 习题 10.5

这是书本上的答案: See ''Implementing Software Timers'' by Don Libes (C Users Journal, vol. 8, no. 11, Nov. 1990) for an example. A copy of this paper is available online at http://www.kohala.com/start/libes.timers.txt. 我参考上面提到的文档,使用 alarm() 以及time() 简略测试了一下.