C(n, k) = m, 固定k,枚举k

这里用到了组合数的一个性质

当k固定的时候,C(2 * k, k) 最小

C(m, k)最大(对于这道题而言是这样,因为大于m 就最终答案不可能为m了)

所以就二分去枚举2*k到m之间了。

最后注意算组合数的时候超过m可以直接返回,同时比较时候可能会超出long long

有小技巧可以避免,看代码。

#include<cstdio>
#include<vector>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; typedef long long ll;
ll m;
vector<pair<ll, ll> > g; ll c(ll n, int k)
{
ll ret = 1;
REP(i, 1, k + 1)
{
if ((ret / i) > (m / (n - i + 1))) return m + 1; //注意这里可能会爆long long,所以要换一种写法
ret = ret * (n - i + 1) / i;
}
return ret;
} void solve()
{
for(int k = 1; c(2 * k, k) <= m; k++)
{
ll l = 2 * k - 1, r = m + 1;
while(l + 1 < r)
{
ll mid = (l + r) >> 1;
ll t = c(mid, k);
if(t == m)
{
g.push_back(make_pair(mid, k));
if(mid != k * 2)
g.push_back(make_pair(mid, mid - k));
break;
}
else if(t < m) l = mid;
else r = mid;
}
}
} int main()
{
int T;
scanf("%d", &T); while(T--)
{
g.clear();
scanf("%lld", &m); solve();
sort(g.begin(), g.end()); printf("%d\n(%lld,%lld)", g.size(), g[0].first, g[0].second);
REP(i, 1, g.size()) printf(" (%lld,%lld)", g[i].first, g[i].second);
puts("");
} return 0;
}

紫书 习题 10-21 UVa 1649 (组合数)的更多相关文章

  1. 紫书 习题 11-9 UVa 12549 (二分图最小点覆盖)

    用到了二分图的一些性质, 最大匹配数=最小点覆盖 貌似在白书上有讲 还不是很懂, 自己看着别人的博客用网络流写了一遍 反正以后学白书应该会系统学二分图的,紫书上没讲深. 目前就这样吧. #includ ...

  2. 紫书 习题 11-8 UVa 1663 (最大流求二分图最大基数匹配)

    很奇怪, 看到网上用的都是匈牙利算法求最大基数匹配 紫书上压根没讲这个算法, 而是用最大流求的. 难道是因为第一个人用匈牙利算法然后其他所有的博客都是看这个博客的吗? 很有可能-- 回归正题. 题目中 ...

  3. 紫书 习题8-12 UVa 1153(贪心)

    本来以为这道题是考不相交区间, 结果还专门复习了一遍前面写的, 然后发现这道题的区间是不是 固定的, 是在一个范围内"滑动的", 只要右端点不超过截止时间就ok. 然后我就先考虑有 ...

  4. 紫书 习题8-7 UVa 11925(构造法, 不需逆向)

    这道题的意思紫书上是错误的-- 难怪一开始我非常奇怪为什么第二个样例输出的是2, 按照紫书上的意思应该是22 然后就不管了,先写, 然后就WA了. 然后看了https://blog.csdn.net/ ...

  5. 紫书 习题 11-10 UVa 12264 (二分答案+最大流)

    书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ...

  6. 紫书 习题 10-13 UVa 11526(打表找规律+分步枚举)

    首先看这道题目,我预感商数肯定是有规律的排列的,于是我打表找一下规律 100 / 1 = 100 100 / 2 = 50  100 / 3 = 33  100 / 4 = 25  100 / 5 = ...

  7. 紫书 习题 10-12 UVa 557(概率计算)

    开始的时候我没有考虑1/2的概率,直接一波组合数,然后WA 后来去看题解发现我们可以反过来想,求最后两个人不一样的情况 这个时候肯定会抛到最后的 所以每一种可能就是(0.5)^(n - 2),然后一共 ...

  8. 紫书 习题7-13 UVa 817(dfs+栈求表达式的值)

    题目链接  点击打开链接 这道题分为两个部分, 一用搜索枚举每种可能, 二计算表达式的值, 有挺多细节需要注意 特别注意我的代码中在计算表达式的值中用到了一个!(代码枚举中的!表示不加符号, 我现在说 ...

  9. 紫书 习题7-8 UVa 12107 (IDA*)

    参考了这哥们的博客 https://blog.csdn.net/hyqsblog/article/details/46980287  (1)atoi可以char数组转int, 头文件 cstdlib ...

随机推荐

  1. GBK编码具体解析(附GBK码位分布图)

    1.GBK码位分布图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA= ...

  2. Object-c Associated Object

    oc的关联的作用在我看来就是将两个对象关联起来,用的时候通过key和对象把和这个对象关联的对象再取出来(我做的项目就是和UITableView里面的一个属性关联起来了) 举个栗子: - (void)v ...

  3. Querying mergeinfo requires version 3 of the FSFS filesystem schema svn右键没菜单

    svn 报错,Querying mergeinfo requires version 3 of the FSFS filesystem schema 经过查询,是svn客户端和服务端版本不一致造成的. ...

  4. HTML5 内联 SVG

    SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用于定义用于网络的基于矢量的图形 SVG 使用 XML 格式定义图形 SVG 图像在放大或改变尺寸的情况下其图形 ...

  5. poj--1904--King's Quest(scc建图)

    King's Quest Time Limit: 15000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit ...

  6. ubuntu16.04下snort的安装(官方文档安装)(图文详解)

    不多说,直接上干货! 最近为了科研,需要安装和使用Snort. snort的官网 https://www.snort.org/ Snort作为一款优秀的开源主机入侵检测系统,在windows和Linu ...

  7. 【DNN 系列】 下载安装

    1.下载 http://dotnetnuke.codeplex.com/releases/view/119857 2.安装 下载完毕 因为 IIS 7 采用了更安全的 web.config 管理机制, ...

  8. SharePoint UserProfileService 接口列表 注解

    Remove Leader 除去领袖 Add Leader  加领袖 Get leaders  获得管理员 Get Profile Scherna Get Profile Scherna Names ...

  9. numa 和 mysql

    cpu numa结构反应的内存访问速度问题: 在多核cpu的时代引入了cpu的numa(非一致内存访问结构): NUMA引入了node的概念,每个物理CPU都被视作一个node,而每个node都有一个 ...

  10. Mac or windows eclipse配置tomcat

    1.选择window --> Preferences 首选项 2.选择server --> Runtime Environements --> Add 3.选择对应的tomcat版本 ...