火花灿灿

题目

数据范围


题解

这个题真的是个神仙题。

我们对于每块石头维护一个$01$串。

这个$01$串的长度是操作次数。

如果$01$串的当前位是$1$,表示这次操作中当前石子被划分到了贡献当中,就是被划分到了$b_i$中。

那么如果所有的石子都单独一堆,必定是所有的$01$串都互不相同。

而且有一个限制就是每一列最多$m$个。

显然$01$的长度具有单调性。

故此二分答案之后考虑怎么验证。

我们相当于在一个$n\times mid$的棋盘上添$1$使得满足要求。

首先有一个贪心,就是对于每一行来讲,能添$k$个数绝对不填$k + 1$个数,这是显然的吧。

故此我们从每行第一个数开始往下填,填到每行$i$个数。

每行$i$个数,共有$C_{mid}^{i}$种情况,也就是说$n -= C_{mid} ^ {i}$。

与此同时,每列会加$C_{mid - 1}^{i - 1}$个数,也就是说$m -= C_{mid - 1} ^ {i - 1}$。

只需要判断一下最后是谁完事儿就行了。

但是如果到了最后,两边都不足以减掉一次怎么办?

只需要判断一下一共还剩下多少$1$可以填,看看够不够剩下的行即可,详见代码。

代码

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

char *p1, *p2, buf[100000];

#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )

int rd() {
int x = 0, f = 1;
char c = nc();
while (c < 48) {
if (c == '-')
f = -1;
c = nc();
}
while (c > 47) {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x * f;
} ll qpow(ll x, ll y) {
int ans = 1;
while (y) {
if (y & 1) {
ans = ans * x;
}
y >>= 1;
x = x * x;
}
return ans;
} int n, m; bool check(int x) {
ll re1 = n - 1;
ll re2 = m;
ll C1 = -1, C2 = -1;
for (int i = 1; i <= x; i ++ ) {
// puts("Fuck");
if (C1 == -1) {
C2 = 1;
C1 = x;
}
else {
(C1 *= (x - i + 1)) /= i;
(C2 *= (x - i + 1)) /= (i - 1);
}
// cout << C1 << ' ' << C2 << endl ;
// cout << re1 << ' ' << re2 << endl ;
if(re1 < C1) {
return re1 * i <= re2 * x;
}
else {
if (re2 < C2) {
return false;
}
else {
re1 -= C1;
re2 -= C2;
}
}
}
if (!re1) {
return true;
}
return false;
} int main() {
// freopen("fire.in", "r", stdin);
// freopen("fire.out", "w")
int T = rd();
while (T -- ) {
n = rd(), m = rd();
if (n == 1) {
puts("0");
continue;
}
int l = 1, r = n;
int ans = n;
check(2);
while (l <= r) {
// printf("%d %d\n", l, r);
int mid = (l + r) >> 1;
if (check(mid)) {
ans = mid;
r = mid - 1;
}
else {
l = mid + 1;
}
}
printf("%d\n", ans);
}
return 0;
}
/*
1
4 2
*/
/*
12
4 1
4 2
7 3
1 1
42 7
2333333 2
2333333 23
2333333 233
2333333 2333
2333333 23333
2333333 233333
2333333 2333333
*/

小结:能开$long\ long$就开吧,不能慢多少。

最新文章

  1. IOC的理解
  2. 恢复 混淆后的 stacktrace 文件
  3. 树莓派摄像头模块转成H264编码通过RTMP实现Html输出
  4. JAVA与数据库开发(JDBC-ODBC、SQL Server、MySQL)
  5. ↗☻【HTML5秘籍 #BOOK#】第4章 Web表单
  6. selenuim +python环境配置遇到的诸多问题
  7. 【二分】NEERC15 L Landscape Improved(2015-2016 ACM-ICPC)(Codeforces GYM 100851)
  8. cf Magic Numbers
  9. HDU 3974 Assign the task 简单搜索
  10. python 基础学习4-with语句
  11. hdu_1034(模拟题)
  12. 10位时间戳转为C#格式时间
  13. C# winform中自定义精确定时器(经测试稳定可靠)
  14. 将对象xml序列化和反序列化
  15. 关于总结一些CentOS7常用的运维命令
  16. 8.Redis内存分配
  17. [CF1132E]Knapsack【暴力搜索】
  18. python全栈开发笔记---------字符串格式化
  19. What Is Apache Hadoop
  20. 构建eureka-server异常ClassNotFoundException: org.springframework.boot.context.embedded.FilterRegistrationBean

热门文章

  1. 【vue】@click绑定的函数,如何同时传入事件对象和自定义参数
  2. Elasticsearch 读时分词、写时分词
  3. SpringBoot+Mybatis-Plus两种分页方法
  4. HGOI 20191103am 题解
  5. neo4j 一些常用的CQL
  6. 一个轻量级的模态组件,“礼貌地”要求您的用户停止使用过时的IE浏览器
  7. Linux-常用shell简介及shell基本操作
  8. Leetcode题目64.最小路径和(动态规划-中等)
  9. 课下选做作业MySort
  10. Python之Javascript