题意:

\(C(n, k) = m(2 \leq m \leq 10^{15})\),给出\(m\)求所有可能的\(n\)和\(k\)。

分析:

设\(minK = min(k, n - k)\),容易看出\(minK\)的值绝对不会太大。

因为\(n \geq 2minK\),经过简单的计算可以知道\(minK\)不超过\(26\)。

所以,可以枚举\(minK\),二分\(n\)来求解,二分的范围是\([minK,m]\)。

二分的过程中需要比较\(C(n,k)\)和\(m\)的大小,因为\(C(n,k)\)可能会太大超过\(long \, long\)的范围,不能直接计算。

所以可以做除法来比较,\(C(n,k)=\prod\limits _{i=1}^k \frac{n-i+1}{i}\)。

用\(m\)逐个去除以\(\frac{n-i+1}{k}\),如果过程中变为了\(0\),说明\(C(n,k)>m\)。

否则\(C(n,k)\)在\(long \, long\)的范围,可以直接计算去比较。

  • 还想到一种(没卵用)优化:

因为\(C(m,1)\)和\(C(m,m-1)\)是显然的一组解,直接加到答案里就好了。

可以从\(minK=2\)开始枚举,\(C(n,2)=\frac{n(n-1)}{2}=m\)。

所以如果有解的话,\(n\)的取值大概在\(\sqrt{2m}\)附近,减少了大概一半的二分次数。

进一步\(minK=3\)的话,\(n\)的范围就更小了,从这个角度我们也可以验证解不会太多。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <utility>
#include <cmath>
using namespace std; typedef long long LL;
typedef pair<LL, LL> PLL; vector<PLL> ans; int cmp(LL n, int k, LL m) {
LL C = 1;
for(int i = 1; i <= k; i++) {
if(m * i / (n - i + 1) / C == 0) return 1;
C = C * (n - i + 1) / i;
}
return C == m ? 0 : -1;
} void output(const PLL& x) {
printf("(%lld,%lld)", x.first, x.second);
} int main()
{
int T; scanf("%d", &T);
while(T--) {
LL m; scanf("%lld", &m);
ans.clear();
ans.push_back(make_pair(m, 1LL));
ans.push_back(make_pair(m, m - 1LL));
for(int i = 2; i <= 30; i++) {
LL L = i, R = m;
while(L <= R) {
LL mid = (L + R) / 2;
int c = cmp(mid, i, m);
if(c == 0) {
ans.push_back(make_pair(mid, i));
ans.push_back(make_pair(mid, mid - i));
break;
} else if(c == 1) R = mid - 1;
else L = mid + 1;
}
}
sort(ans.begin(), ans.end());
ans.resize(unique(ans.begin(), ans.end()) - ans.begin());
printf("%d\n", ans.size());
if(!ans.empty()) output(ans[0]);
for(int i = 1; i < ans.size(); i++) {
printf(" "); output(ans[i]);
}
printf("\n");
} return 0;
}

UVa 1649 Binomial coefficients 数学的更多相关文章

  1. UVA 1649 Binomial coefficients

    https://vjudge.net/problem/UVA-1649 题意: 输入m,求所有的C(n,k)=m m<=1e15 如果枚举n,那么C(n,k)先递增后递减 如果枚举k,那么C(n ...

  2. UVA - 1649 Binomial coefficients (组合数+二分)

    题意:求使得C(n,k)=m的所有的n,k 根据杨辉三角可以看出,当k固定时,C(n,k)是相对于n递增的:当n固定且k<=n/2时,C(n,k)是相对于k递增的,因此可以枚举其中的一个,然后二 ...

  3. UVa 1639 - Candy(数学期望 + 精度处理)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. UVA 12898 - And Or 数学

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  5. UVA 10668 - Expanding Rods(数学+二分)

    UVA 10668 - Expanding Rods 题目链接 题意:给定一个铁棒,如图中加热会变成一段圆弧,长度为L′=(1+nc)l,问这时和原来位置的高度之差 思路:画一下图能够非常easy推出 ...

  6. UVa 1639 Candy (数学期望+组合数学+高精度存储)

    题意:有两个盒子各有n个糖,每次随机选一个(概率分别为p,1-p),然后吃掉,直到有一次,你打开盒子发现,没糖了! 输入n,p,求另一个盒子里糖的个数的数学期望. 析:先不说这个题多坑,首先要用lon ...

  7. UVa 10288 - Coupons(数学期望 + 递推)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. 51nod1245 Binomial Coefficients Revenge

    题目来源: HackerRank 基准时间限制:2 秒 空间限制:131072 KB 分值: 640  C(M,N) = M! / N! / (M - N)! (组合数).给出M和质数p,求C(M,0 ...

  9. Uva - 12230 Crossing Rivers (数学期望)

    你住在村庄A,每天需要过很多条河到另一个村庄B上班,B在A的右边,所有的河都在A,B之间,幸运的是每条船上都有自由移动的自动船, 因此只要到达河左岸然后等船过来,在右岸下船,上船之后船的速度不变.现在 ...

随机推荐

  1. 数据库(DBUtils)

    DBUtils和连接池 今日内容介绍 u DBUtils u 连接池 第1章 DBUtils 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache c ...

  2. 2833 奇怪的梦境 未AC

    2833 奇怪的梦境 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold         题目描述 Description Aiden陷入了一个奇怪的梦境:他被困在一个小 ...

  3. This is your path and you will pursue it with excellence.

    This is your path and you will pursue it with excellence.自己选的路就要走出精彩.

  4. sql2012,返回数据多时不走索引

    当数据达到一定值时,都会走表扫描旧版如SQL2005时就有计算选择性的比例为 满足条件的行数/总行数<=0.7181,会走索引,其它会走表扫描有兴趣可以自己去不同版本中去测试 Roy Wu(吴熹 ...

  5. Android商城开发系列(十三)—— 首页热卖商品布局实现

    热卖商品布局效果如下图: 这个布局跟我们上节做的推荐是一样的,也是用LinearLayout和GridView去实现的,新建一个hot_item.xml,代码如下所示: <?xml versio ...

  6. node18 服务器上 pytorch cyclegan 测试有问题,numpy 版本不对

    提示如下错误: module compiled against API version 0xb but this version of numpy is 0xa 尝试的方法: pip install ...

  7. bootstrap table保留多选框的分页

    有时候需要完成这种情况: 1.需要设置的是如果第一页点击复选框然后点击其他页面的话,第一页的选项被保存了 2.将所有选择好的复选款的数据保存在数组中 bootstrap table官方文档http:/ ...

  8. linux 命令——47 iostat (转)

    Linux系统中的 iostat 是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会 汇报出CPU使用情况 ...

  9. selenium跳过https的问题

    背景: 周六产品给我反馈:支付成功页面后会提示这个,问自动化为什么没有发现这样的问题 第一反应:这个地址肯定被举报了,我也肯定没有设置过安全链接,因为都没有见过这样的网址,如果有问题,应该会直接出错, ...

  10. 【BZOJ2141】排队

    点此看题面 大致题意: 给你一个序列,每次交换两个数,求每次操作后的逆序对个数. 关于另一道题目 推荐先去看一下这道题目:[洛谷3759][TJOI2017] 不勤劳的图书管理员(貌似是此题的升级版) ...