题目描述
  二项式定理(英语:Binomial theorem),又称牛顿二项式定理,由艾萨克•牛顿于1664年、1665年期间提出。该定理给出两个数之和的整数次幂诸如 展开为类似 项之和的恒等式。二项式定理可以推广到任意实数次幂,即广义二项式定理。二项式定理可以用以下公式表示:
   
  我们称C(n,k)为二项式系数。

  现在,你要解决得问题是:已知某二项数系数为m,那么有多少个(n,k)满足(C(n,k)=m,按照n升序排列,若n相同,则按k升序排列。

输入

  第一行为整数T,表示数据组数。接下来的T行,每组数据占一行,为一个整数m。

输出

  每组数据输出两行,第一行为满足条件的(n,k)的数,接下来一行为满足条件的(n,k)对,每队用括号括起来,括号之间用一个空格分开。按n升序排列,若n相同,则按k升序排列。

提示

2<=m<=10^15

分析:

这题刚拿到无从下手,一想反正是练习题时间充足,就找了两三个小时的规律,无奈太弱没找出来....

于是只有通过正当途径找。因为没有找到规律,且这种已知结果求组合数的n,k的问题也没有涉及过,所以枚举什么的应该是无法避免了。

但可以睿智地枚举。首先不要枚举n。因为一旦m大了之后,n的枚举范围可能会异常大,不明智。相对来说k就好枚举多了,根据二项式定理的推论,C(n,n/2)最大,C(n,1)最小。此处k固定,那么n=2*k是最小的二分范围,n=m是最大的二分范围。于是,k通过for循环枚举,每枚举一个k就二分找n。

注意枚举k时也可以加一个判断,如果C(2*k,k)比m还大,说明n取最小的时候都已经无解了,就直接退出。

检查n是否正确:直接计算,因为组合数除掉的数始终比乘上的数小,所以一旦中间结果大于m就直接返回m+1表示不成立。

另:最多的有8对...

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
int T;
LL M,tot;
struct data{LL N,K;}ans[10];
bool cmp(data a,data b) {return a.N==b.N?a.K<b.K:a.N<b.N;}LL check(LL n,LL m)
{LL a=1;for(int i=1;i<=m;i++){if(a/i>M/(n-i+1)) return M+1;a*=(n-i+1);a/=i;}return a;
}void solve()
{tot=0;LL l,r,mid,t;for(LL k=1;check(k*2,k)<=M;k++){l=2*k,r=M;while(r>=l){mid=(r+l)/2;t=check(mid,k);if(t==M){ans[++tot]=(data){mid,k};if(mid!=k*2) ans[++tot]=(data){mid,mid-k};break;}else if(t>M) r=mid-1;else l=mid+1;}}
}int main()
{
//  freopen("in.txt","r",stdin);scanf("%d",&T);while(T--){scanf("%lld",&M);solve();if(tot) sort(ans+1,ans+1+tot,cmp);printf("%d\n",tot);for(int i=1;i<=tot;i++) {printf("(%lld,%lld)",ans[i].N,ans[i].K);if(i!=tot) printf(" ");}if(T) printf("\n");}return 0;
}

二项式系数(枚举+二分+二项式定理)相关推荐

  1. 【HDU 5936 --- Difference】折半枚举+二分

    [HDU 5936 --- Difference]折半枚举+二分 Description Little Ruins is playing a number game, first he chooses ...

  2. Subset POJ - 3977(折半枚举+二分+二进制枚举)

    题意: 给你一个集合N(N<=35),问集合的子集,除了空集,使得自己中所有元素和的绝对值最小,若存在多个值,那么选择子集中元素最少的那个. 题目: Given a list of N inte ...

  3. HDU-4282 A very hard mathematic problem 技巧枚举+二分

    题意 xz+yz+x∗y∗z=kx^z+y^z+x*y*z = k ( y>x&&z>1y>x&&z>1) 给我们这个等式让我们找出这里面有多少 ...

  4. 超大背包问题(二进制枚举 + 二分)

    超大背包问题 第一次看到这一题好像是在某一场比赛,就是给你一个炸空间和时间的背包,让你选最大的价值,看似是01背包然鹅今天在挑战程序设计这本书上看到了这题,看到了作者的做法,感觉豁然开朗,直接暴搜也会 ...

  5. zstu新生赛 Problem A: Baby Coins(折半枚举+二分)

    Problem A: Baby Coins Time Limit: 1 Sec Memory Limit: 128 MB Submit: 274 Solved: 29 Description Baby ...

  6. Codeforces Round #509 D - Glider(枚举二分前缀和)

    题意: 给出滑翔机的高度h 以及有n段上升气流区间,滑翔机在非上升气流区间会以每前进一个单位 高度就下降一个单位的 速度坠落 ,而在有上升气流的区间,滑翔机将持续前进,并不会下落,问在一维坐标上的哪个 ...

  7. 【打表枚举+二分】喜爱

    喜爱 题目描述: 小s最近对数字情有独钟.他又发现了一种神奇的数字.对于数x,如果它二进制表示中只有一位是0,则x就会被小s所喜爱.比如5,二进制为101,则它被小s所喜爱. 现在,小s想知道,对于一 ...

  8. 【COCI11-12 #4】纠结的数【枚举+二分+容斥】

    题目描述: 找出第N小的正整数X,满足条件X的最小的素因子是P.如果X的值超过10^9,则输出0. 输入格式:第1行:2个整数N和P (1 ≤ N, P ≤ 10^9),P一定是素数 题目分析: 如果 ...

  9. CodeForces 1041D Glider 枚举+二分

    题目链接:https://vjudge.net/problem/CodeForces-1041D/origin 题意: 飞行员在区间[-1e9,1e9]内(这个一定注意!!!),从高度为k处跳伞,会向 ...

最新文章

  1. java out of range_关于Parameter index out of range求解决办法
  2. 自定义配置webpack打包文件
  3. C++ STL快速入门
  4. 【转】匈牙利算法理解
  5. oracle数据库视图有红叉,oracle触发器 前面的红叉是什么意思
  6. 还没毕业就被阿里30万年薪预定,他凭什么?
  7. cad的lisp程序大集合_大数据成神之路-Java高级特性增强(CopyOnWriteArraySet)
  8. 2013国家二级c语言上机考试点了编译并运行出现黑框闪退,2013年计算机二级C语言上机试题及解析2...
  9. R︱Softmax Regression建模 (MNIST 手写体识别和文档多分类应用)
  10. git 总是要求输入密码的问题
  11. Vue写的一个网站项目
  12. BN层详解(含有公式推导过程)
  13. ACER 4750G开机卡在LOGO解决办法
  14. Microsoft office 2013安装图解
  15. 基于微博平台的python爬虫数据采集,非常简单的小案例!
  16. CS5213芯片|HDMI to VGA转换头芯片资料分享
  17. Hibernate实战——双向N-N关联
  18. 视频会议检测不到摄像头,电脑打开相关功能提示无法使用-驱动人生解决方案
  19. First part of my Spring posts is refreshed
  20. Unicode编码的实现

热门文章

  1. 解决办法在idea中搭建spark环境:Unable to fetch table student. Invalid method name: ‘get_table_req‘;
  2. Macbook双系统 10.11及Ubuntu
  3. CoBOT检测出AI开源框架TensorFlow中的缺陷
  4. python怎么念1001python怎么念-python 星号的使用
  5. 【网易2017春招】赶去公司 解题报告
  6. SpringBoot库存管理系统,拿来学习真香
  7. 计算机组装与维修专用周报告,《计算机组装与维护专用周》实习报告.doc
  8. httpqyl.php,linux运维架构--PHP开发-零基础学习PHP视频教程
  9. XCTF-mobile app3
  10. 关于Xilinx SDK工具的使用问题求解