UVa 1649 Binomial coefficients 数学
题意:
\(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 数学的更多相关文章
- UVA 1649 Binomial coefficients
https://vjudge.net/problem/UVA-1649 题意: 输入m,求所有的C(n,k)=m m<=1e15 如果枚举n,那么C(n,k)先递增后递减 如果枚举k,那么C(n ...
- UVA - 1649 Binomial coefficients (组合数+二分)
题意:求使得C(n,k)=m的所有的n,k 根据杨辉三角可以看出,当k固定时,C(n,k)是相对于n递增的:当n固定且k<=n/2时,C(n,k)是相对于k递增的,因此可以枚举其中的一个,然后二 ...
- UVa 1639 - Candy(数学期望 + 精度处理)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 12898 - And Or 数学
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA 10668 - Expanding Rods(数学+二分)
UVA 10668 - Expanding Rods 题目链接 题意:给定一个铁棒,如图中加热会变成一段圆弧,长度为L′=(1+nc)l,问这时和原来位置的高度之差 思路:画一下图能够非常easy推出 ...
- UVa 1639 Candy (数学期望+组合数学+高精度存储)
题意:有两个盒子各有n个糖,每次随机选一个(概率分别为p,1-p),然后吃掉,直到有一次,你打开盒子发现,没糖了! 输入n,p,求另一个盒子里糖的个数的数学期望. 析:先不说这个题多坑,首先要用lon ...
- UVa 10288 - Coupons(数学期望 + 递推)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- 51nod1245 Binomial Coefficients Revenge
题目来源: HackerRank 基准时间限制:2 秒 空间限制:131072 KB 分值: 640 C(M,N) = M! / N! / (M - N)! (组合数).给出M和质数p,求C(M,0 ...
- Uva - 12230 Crossing Rivers (数学期望)
你住在村庄A,每天需要过很多条河到另一个村庄B上班,B在A的右边,所有的河都在A,B之间,幸运的是每条船上都有自由移动的自动船, 因此只要到达河左岸然后等船过来,在右岸下船,上船之后船的速度不变.现在 ...
随机推荐
- Java面向对象的练习。动物乐园
本次项目是:以面向对象的思想设计动物乐园系统. 动物乐园中有猫,狗,鸭子等成员,还可以增加新成员. 猫和鸭子都有自己的名字,都有自己的腿,但腿的条数不同,猫和鸭子会发出叫声,猫的叫声是:喵喵喵……,鸭 ...
- 一个容易被忽视的css选择器
之前学的的迷糊了,也不知道什么会什么不会了,跑去面试了.别人列出一堆css选择器,本以为选择器没啥的,结果到那个多类选择器翻车了,.a.b选择同时含a,b类名的,很尴尬所以回来仔细整理了一下.目前根据 ...
- genlist -s 192.168.21.\*
显示网段192.168.21中可用的主机.
- Java反序列化漏洞详解
Java反序列化漏洞从爆出到现在快2个月了,已有白帽子实现了jenkins,weblogic,jboss等的代码执行利用工具.本文对于Java反序列化的漏洞简述后,并对于Java反序列化的Poc进 ...
- hihoCoder #1143 : 骨牌覆盖问题·一 (斐波那契数列)
题意:我们有一个2xN的长条形棋盘,然后用1x2的骨牌去覆盖整个棋盘.对于这个棋盘,一共有多少种不同的覆盖方法呢? 思路:这是斐波那契数列啊,f[n] = f[n-1] + f[n-2],初始时 f[ ...
- SVN和Git的区别
这个地方就简单介绍一下 svn 的模式是: 1.写代码. 2.从服务器拉回服务器的当前版本库,并解决服务器版本库与本地代码的冲突. 3.将本地代码提交到服务器. Git分布式版本管理的模式是: 1.写 ...
- 【BZOJ1076】[SCOI2008] 奖励关(状压DP)
点此看题面 大致题意:总共有\(n\)个宝物和\(k\)个回合,每个回合系统将随机抛出一个宝物(抛出每个宝物的概率皆为\(1/n\)),吃掉一个宝物可以获得一定的积分(积分可能为负),而吃掉某个宝物有 ...
- 关于mongodb的日志
mongodb的日志与profile相似,在启动mongod时 可以用verbose这个参数配置他的日志详细程度,分为一个v到5个v,其中v越多,详细度越高 mogod.conf port = d ...
- 5.1 Object类型
创建Object实例的方式有两种 ① 使用new操作符跟Object构造函数 var person = new Object(); person.name = "Tom"; pei ...
- Windows下配置Jmeter环境变量
一.安装SDK 1.下载并安装sdk,安装目录为D:\Program Files (x86)\Java\jdk1.7.0_01 2.配置环境变量 1)新建系统变量:JAVA_HOME = D:\Pro ...