The 18th Zhejiang Provincial Collegiate Programming Contest

GYM链接 https://codeforces.com/gym/103055

F

题意:

给定两个整数\(n\)和\(m\),有两种操作:

  1. 当\(n\geq 2\)时,将\(n\)的值减少\(1\)。
  2. 将\(m\)的值增加\(1\)。

求最小操作数,使得\(n|m\)。

思路:

显然,当\(n\geq m\)时答案为\(n - m\), 下面我们来讨论当\(n < m\)时的情况:
我们假设当取得答案时的\(n\)的值为\(x\),对于此情况下,要使满足题意的\(m\)的值为\(x\times \lceil \frac {m} {x} \rceil\).
下面我们先来证明这个结论:
记此时的\(m\)为\(m_0\).
\(\because\) \(m\)%\(x\neq0\).
\(\therefore\) \(m = x\times q + c.(c < x)\) \(\Rightarrow q = \frac{m - c}{x}.\)
显然 \(m_0 = x \times(q + 1) = x \times (\frac {m - c}{x} + 1) = x \times (\frac{m - c + x}{x})\).
\(\because\) \(c < x\).
\(\therefore\) \(\frac{m - c + x}{x} = \lceil\)\(\frac{m}{x}\rceil\).
\(\therefore\) $m_0 = x \times $ \(\lceil\)\(\frac{m}{x}\rceil\).
所以对于给定的\(x\)我们的最终答案$ans = x \times $ \(\lceil\)\(\frac{m}{x}\rceil - m + n - x\),显然我们只要考虑 \(x \times \lceil \frac mx \rceil - x\).
那么问题就变成了求 \(f(x)_{min} = x \times \lceil \frac mx \rceil - x.(1 \leq x \leq n)\)
我们发现对于这个式子,我们除了从\(1\)到\(n\)去枚举,我们别无他法,但这显然时间复杂度较高,我们是不可以接受的,所以我们要继续化简它。
\(f(x) = x \times \lceil \frac mx \rceil - x = x \times \lfloor \frac{m + x -1}{x} \rfloor - x = x \times(\lfloor\frac{m + x -1 }{x} \rfloor - 1) = x \times(\lfloor\frac{m + x - x - 1}{x} \rfloor)= x \times \lfloor \frac {m-1}{x} \rfloor\)
到了这里,我们终于看到了一个熟悉的式子,上面这个式子我们可以使用整除分块来解决。
下面我们再来解释一下如何解决上面这个式子:
我们先忽略对\(m\)的减\(1\),我们很容易可以发现,对于固定的\(m\)和任意的\(x\),有相当连续一段的\(x\)对于\(\lfloor \frac {m }{x}\rfloor\)的值是一样的,我们把值相同的所有连续的\(x\)切割成一段,本题让我们求的是最小值,那我们只要枚举每一段的第一个数取最小值就可以了,那么究竟每一段右端是多少呢?
对于\(\forall x(x\leq m)\),我们要找到一个最大的\(j\),使得\(\lfloor \frac {m}{x}\rfloor\) = \(\lfloor \frac {m}{j}\rfloor\).
我们设\(k = \lfloor \frac {m}{x}\rfloor\),那么:
\(\lfloor \frac {m}{j}\rfloor = k \Leftrightarrow k \leq \frac mj < k + 1 \Leftrightarrow \frac {1}{k + 1} < \frac jm \leq \frac 1k \Leftrightarrow \frac{m}{k + 1} < j \leq \frac mk\),又因为\(j\)是整数,所以\(j_{max} = \lfloor \frac mk \rfloor = \lfloor \frac{m}{\lfloor \frac m x\rfloor} \rfloor\).
至此,我们终于找到了这个区间的右端。所以我们可以在\(O(\sqrt m)\) 的时间内枚举完成.

代码:

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
typedef long double ld;
const double eps = 1e-6;
const ll N = 1e3 + 10;
const ll M = 4e6 + 10;
const ll INF = 1e8+10;
const ll mod = 1e9+7;
#define ywh666 std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define all(a) a.begin(),a.end()
int main(){
ywh666;
int t;
cin >> t;
while(t --){
int m, n;
cin >> n >> m ;
int mi = 0x3f3f3f3f;
if(n >= m){
cout << n - m << endl;
}else{
m -- ;
for(int l = 1, r ; l <= n ; l = r + 1){
r = min(n, m / (m / l));
mi = min(mi, (m / l) * l);
}
cout << mi + n - m - 1 << endl;
}
} return 0 ;
}

最新文章

  1. 【Prince2是什么】PRINCE2认证之PRINCE2的思维结构
  2. 学习.NET是因为热爱 or 兴趣 or 挣钱?
  3. BLOG搬家
  4. android 进程间通信---bind的前世
  5. HDU 4511 (AC自动机+状态压缩DP)
  6. 解决方法:java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
  7. hadoop2.2.0安装
  8. 函数flst_init
  9. [Codeforces Round #237 (Div. 2)] A. Valera and X
  10. iOS8互动的新通知
  11. 转:Web网站性能测试分析及调优实例
  12. sed awk 小例
  13. JAVA 发送邮件代码---发送HTML内容
  14. (转)HTTP1.0和HTTP1.1的区别
  15. 主备(keepalived+nginx)
  16. JVM虚拟机(1)---常用JVM配置参数
  17. Spring中属性注入的几种方式以及复杂属性的注入
  18. Kay and Snowflake CodeForces - 685B (重心, 好题)
  19. 无界面运行Jmeter压测脚本 --后知者
  20. [源码]underscore-1.8.3

热门文章

  1. 前端面试题(css)
  2. MongoDB 事务机制
  3. mysql数据库-8.0安装及环境搭建
  4. 与Flash 中国特供版斗智斗勇
  5. springcloud报错-Ribbon整合Eureka,出现 No instances available for XXX 异常
  6. 【freertos】004-任务创建与删除及其实现细节
  7. 实现一个函数功能:sum(1,2,3,4..n)转化为 sum(1)(2)(3)(4)…(n)?
  8. Constant Pool和String Constant Pool详解
  9. 为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动 的区别在哪里?
  10. jQuery--事件绑定|委派|切换