题目要求当\(0\leq a\leq b\leq n\)时,\(k\)个\(\tbinom{b}{a}\)的和的最大值

观察杨辉三角形,可以发现,最大的\(\tbinom{b}{a}\),为\(\tbinom{n}{\frac{n}{2}}\)

还可以知道,除了当前最大的组合数以外,可能最大的,是它周围的四个

即如果当前确定的最大组合数为\(\tbinom{n}{m}\),则接下来有可能成为最大的数是:\(\tbinom{n}{m-1},\tbinom{n}{m+1},\tbinom{n-1}{m-1},\tbinom{n-1}{m}\)

可以写一个杨辉三角理解一下

然后可以用一个优先队列维护,每次取出当前的最大值

那么如何比较两个组合数的大小?写高精算出来(bushi

用一个神奇的方法:取\(\log\)

由\(\log ab=\log a+\log b,\log\frac{a}{b}=\log a-\log b\)

则可以先预处理出\(\log x!,0\leq x\leq n\),然后再算组合数\(\tbinom{n}{m}=\log n!-\log m!-\log (n-m)!\)

然后在堆中比较\(\log\)的大小

然后我愉快的把堆写炸了

算组合数就是预处理阶乘和阶乘逆元就行了

一定要记得判断当前最大的组合数周围的那四个数是否存在,具体见代码

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<map>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
int x=0,y=1;
char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int n,k;
const LL mod=1e9+7;
struct data{
int n,m;
double Log;
}dui[500006];
int size;
LL fac[1000006],inv[1000006];
double Log[1000006];
std::map<std::pair<int,int>,bool>map;
inline void push(data x){
map[std::make_pair(x.n,x.m)]=1;
dui[++size]=x;
reg int i=size,fa;
while(i>1){
fa=i>>1;
if(dui[fa].Log>dui[i].Log) break;
std::swap(dui[fa],dui[i]);i=fa;
}
}
inline data pop(){
data ret=dui[1];dui[1]=dui[size--];
reg int i=1,ls,rs;
while((ls=i<<1)<=size){
rs=ls|1;
if(rs<=size&&dui[rs].Log>dui[ls].Log) ls=rs;
if(dui[i].Log>dui[ls].Log) break;
std::swap(dui[i],dui[ls]);i=ls;
}
return ret;
}
inline LL power(LL a,LL b){
LL ret=1;
while(b){
if(b&1) ret=(ret*a)%mod;
a=(a*a)%mod;b>>=1;
}
return ret;
}
inline void pre(){
fac[0]=inv[0]=1;
for(reg int i=1;i<=n;i++) fac[i]=(fac[i-1]*i)%mod;
inv[n]=power(fac[n],mod-2);
for(reg int i=n-1;i;i--) inv[i]=(inv[i+1]*(i+1))%mod;
for(reg int i=1;i<=n;i++) Log[i]=log(i)+Log[i-1];
}
inline double getLog(int nn,int mm){
return Log[nn]-Log[mm]-Log[nn-mm];
}
int main(){
n=read();k=read();
pre();
push((data){n,n/2,getLog(n,n/2)});
reg data now;
reg LL ans=0;
std::pair<int,int>tmp;
reg int nn,mm;
while(k--){
now=pop();
nn=now.n;mm=now.m;
ans+=((fac[nn]*inv[mm])%mod*inv[nn-mm])%mod;
ans%=mod;
// std::printf("%d %d %d\n",ans,nn,mm);
if(mm-1>=0){
tmp=std::make_pair(nn,mm-1);
if(!map[tmp])
push((data){nn,mm-1,getLog(nn,mm-1)});
}
if(mm+1<=nn){
tmp=std::make_pair(nn,mm+1);
if(!map[tmp])
push((data){nn,mm+1,getLog(nn,mm+1)});
}
if(mm-1>=0&&nn-1>=0){
tmp=std::make_pair(nn-1,mm-1);
if(!map[tmp])
push((data){nn-1,mm-1,getLog(nn-1,mm-1)});
}
if(nn-1>=mm){
tmp=std::make_pair(nn-1,mm);
if(!map[tmp])
push((data){nn-1,mm,getLog(nn-1,mm)});
}
}
std::printf("%lld",ans);
return 0;
}

P4370 [Code+#4]组合数问题2的更多相关文章

  1. POJ 1850 Code(组合数)

    http://poj.org/problem?id=1850 题意 :给定字符串,系统是用字符串组成的,字符串是按字典序排的.编码系统有三条规则,1这些的单词的长度是由小到大的,2相同长度的按字母在字 ...

  2. 清北学堂Day3

    卷积公式(Dirichlet卷积) 这个式子看上去就很变态,那么他是什么意思呢: 就是说 函数f(x)和g(x)对于n的卷积等于n的每一个因子d在f(x)上的值乘上d/n在g(x)上的值的和 例:设g ...

  3. Solution -「Code+#4」「洛谷 P4370」组合数问题 2

    \(\mathcal{Description}\)   Link.   给定 \(n,k\),求 \(0\le b\le a\le n\) 的 \(\binom{a}{b}\) 的前 \(k\) 大. ...

  4. poj Code(组合数)

    Code Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9918   Accepted: 4749 Description ...

  5. Code (组合数)

    Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7184   Accepted: 3353 Description Trans ...

  6. POJ 3904 JZYZOJ 1202 Sky Code 莫比乌斯反演 组合数

    http://poj.org/problem?id=3904   题意:给一些数,求在这些数中找出四个数互质的方案数.   莫比乌斯反演的式子有两种形式http://blog.csdn.net/out ...

  7. LCM性质 + 组合数 - HDU 5407 CRB and Candies

    CRB and Candies Problem's Link Mean: 给定一个数n,求LCM(C(n,0),C(n,1),C(n,2)...C(n,n))的值,(n<=1e6). analy ...

  8. C++单元测试 之 gtest -- 组合数计算.

    本文将介绍如何使用gtest进行单元测试. gtest是google单元测试框架.使用非常方便. 首先,下载gtest (有些google项目包含gtest,如 protobuf),复制目录即可使用. ...

  9. 【BZOJ-4591】超能粒子炮·改 数论 + 组合数 + Lucas定理

    4591: [Shoi2015]超能粒子炮·改 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 95  Solved: 33[Submit][Statu ...

随机推荐

  1. 基于 HTML5 WebGL 的楼宇智能化集成系统(三)

    前言       2018年7月,信息化部印发了<工业互联网平台建设及推广指南>和<工业互联网平台评价方法>,掀起了 工业互联网 的浪潮,并成为热词写入了报告中.同为信息发展下 ...

  2. 从零搭建一个SpringCloud项目之Config(五)

    配置中心 一.配置中心服务端 新建项目study-config-server 引入依赖 <dependency> <groupId>org.springframework.cl ...

  3. posix系统线程调度-设置线程优先级

    #include <thread> #include <mutex> #include <iostream> #include <chrono> #in ...

  4. Centos7_Root密码重置

    原因: 最近出去见女朋友,竟然忘了Root用户的密码,此时考验linux基础扎不扎实的时候到了... 操作步骤: 解释补充: mount -o remountr,w / #修改根目录文件系统的权限,实 ...

  5. Git应用详解第十讲:Git子库:submodule与subtree.md

    前言 前情提要:Git应用详解第九讲:Git cherry-pick与Git rebase 一个中大型项目往往会依赖几个模块,git提供了子库的概念.可以将这些子模块存放在不同的仓库中,通过submo ...

  6. spring源码阅读笔记08:bean加载之创建bean

    上文从整体视角分析了bean创建的流程,分析了Spring在bean创建之前所做的一些准备工作,并且简单分析了一下bean创建的过程,接下来就要详细分析bean创建的各个流程了,这是一个比较复杂的过程 ...

  7. 联通友华通信光纤猫PT952G设置无线路由光猫桥接拨号

    #0x1 登陆后台,点击网络,点击宽带设置.选择第二个接口. 0x2 只修改模式,改成Bridge,其他无需修改.然后直接接路由器拨号就行,或者电脑都行. 0x4  恢复默认拨号,这样修改以后,直接连 ...

  8. vue-element-admin执行npm install 报错

    如果你出现这类报错: 那么恭喜你,因为这个问题很好解决. ----------------------- 解决方法: git config --global url."https://&qu ...

  9. BUUOJ [CISCN2019 华北赛区 Day2 Web1]Hack World

    补一下这道题,顺便发篇博客 不知道今年国赛是什么时候,菜鸡还是来刷刷题好了 0X01 考点 SQL注入.盲注.数字型 0X02自己尝试 尝试输入1 赵师傅需要女朋友吗???随便都能有好吧 输入2 ?? ...

  10. tensorflow1.0 模型的保存与加载

    import tensorflow as tf import numpy as np # ##Save to file # W = tf.Variable([[4,5,6],[7,8,9]],dtyp ...