题解 CF 1372 B
题目
题意
给出 \(n\),输出 \(a\) ,\(b\) (\(0 < a \leq b < n\)),使\(a+b=n\)且 \(\operatorname{lcm}(a,b)\) 最小。
思路
前言

如果你没有到现场,你永远也不会体验到cf 的 OI赛制有多强,评测队列曾超过15min,不得不让此次比赛unrated。

但是,我也不知道怎么B、C题提交把语言选成了:C11 ,然后在20分钟后完美地CE 了。
声明
lcm : 最小公倍数
minn : n 的最小质因数
mul : n 的最大 \(\neq n\) 的约数
分析
我们首先找出使 \(\operatorname{lcm}(a,b)\) 最小的 \(a\),\(b\)。
\(\because \operatorname{lcm}(a,b)=\frac{a\times b}{\gcd(a,b)}\) ,
\(\therefore\) 我们可以找到 \(n\) 最小的质因数 \(minn\) ,再找到 \(n\) 最大的约数(\(\neq n\))\(mul=\frac{n}{minn}\)。
当 \(n\) 为合数时,我们令答案为 \(mul\) , \((minn-1)\times mul\)。
当 \(n\) 为质数时,我们令答案为 \(1\) , \(n-1\)。
输出即可。
正确性
证1
证:当 \(n\) 为质数, \(k_1=1\) 时 ,\(\operatorname{lcm}(k_1,n-k_1)\) 最小
首先,设 \(k_1 > 0\),\(k_2=n-k_1\),且\(k_1<k_2\)。
\(\because\) \(n\) 为质数,\(\gcd(k_1,k_2) = 1\),
\(\therefore\) \(\operatorname{lcm}(k_1,k_2)=k_1\times (n-k_1)\)
当 \(k_1 = 1\) ,\(\operatorname{lcm}(k_1,k_2)=n-1\)
若 \(k_1 = 1 + h\)(\(1\leq h\leq \frac{n}{2}\)) ,则
\(\operatorname{lcm}(k_1,k_2)=(1+h)\times (n-1-h) = n - 1 +h \times (n-2-h) > n - 1\)
\(\therefore\) 当 \(n\) 为质数时,\(\operatorname{lcm}(1,n-1)\) 最小。
当然也可以表述为:当 \(n\) 为质数, \(a=1\) 时 ,\(a\times (n-a)\) 最小
类似地,我们也可证明: \(a=1\) 时 ,\(a\times (n-a)\) 最小
我们已经证明了情况2。
证2
证:当 \(n\) 为合数, \(k_1=mul\) 时,\(\operatorname{lcm}(k_1,n-k_1)\) 最小
首先,设 \(k_1 > 0\),\(k_2=n-k_1\),且\(k_1<k_2\) , \(q = \gcd(k_1,k_2) > 1\)。
令 \(n=g \times q\) , \(k_1=g_1 \times q\) ,\(k_2 = g_2\times q\) , \(g_1+g_2 =g\)
\(\operatorname{lcm}(k_1,n-k_2)=\frac{k_1 \times (n-k_1)}{q} = g_1\times q \times g_2\)
\(\therefore\) 当 \(g_1=1\) , \(g_1\times g_2\) 最小,
\(\therefore \operatorname{lcm}(k_1,n-k_2)=g_1\times q \times g_2 \geq (g-1)\times q =n - q\) (仅当 \(k_1 = q\) 等号成立)
我们再让 \(q\) 取最大为 \(mul\) 即可让\(\operatorname{lcm}(k_1,n-k_2)\) 最小 ,此时 \(k_1=mul\)
证明完毕(如有漏洞请轻喷)
算法
先用线性筛筛出1e5以内素数,方便找答案。
再一个个枚举素数,找到最小的质因子(如果有),判断情况(如果找不到 \(n\) 就肯定是素数),输出答案。
代码
/*
* Author :Werner_Yin
* Time: 2020-07-11 23:20:15
* I believe I can AC !
*/
#include <bits/stdc++.h>
#define lol long long
#define GDB(x) cout<<"DATA "<<#x<<" :"<<x<<endl;
#define mes(x) memset(x,0,sizeof(x))
using namespace std;
template <typename T>
void re(T &x){
#define ge getchar()
x = 0;int sgn = 1;char ch = ge;
for(;!isdigit(ch);ch = ge) if(ch == '-') sgn = -1;
for(;isdigit(ch);ch = ge) x = (x<<1)+(x<<3)+(ch^48);
x *= sgn;
}
template <typename T>
void write(T x){
if(x == 0) putchar(48);
else if(x < 0) putchar('-');
int k = 0,que[20];
while(x > 0){
que[++k]=x % 10;
x /= 10;
}
for(int i = k;i > 0;i--) putchar(que[i] + 48);
return;
}
const int MAXN = 1e5 + 10;
int PrimeNum = 0,Prime[MAXN];
bool IsNotPrime[MAXN];
void shai (){
for(int i = 2;i < MAXN;i++){
if(!IsNotPrime[i]){
Prime[PrimeNum++] = i;
}
for(int j = 0;j < PrimeNum && Prime[j] * i < MAXN;j++){
IsNotPrime[Prime[j] * i] = 1;
if(i % Prime[j])break;
}
}
}
int main (){
shai();
int T;
re(T);
while(T--){
int n;
re(n);
int minn = -1;
for(int i = 0;i < PrimeNum ;i++){
if(n % Prime[i] == 0){
minn = Prime[i];
break;
}
}
int mul = n / minn;
if(minn == -1||mul == 1) {write(1);write(n-1);}
else{write ( 1 * mul);write( (minn-1)*mul);}
putchar('\n');
}
return 0;
}
题解 CF 1372 B的更多相关文章
- 竞赛题解 - CF Round #524 Div.2
CF Round #524 Div.2 - 竞赛题解 不容易CF有一场下午的比赛,开心的和一个神犇一起报了名 被虐爆--前两题水过去,第三题卡了好久,第四题毫无头绪QwQ Codeforces 传送门 ...
- 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T5(思维)
还是dfs? 好像自己写的有锅 过不去 看了题解修改了才过qwq #include <cstdio> #include <algorithm> #include <cst ...
- 竞赛题解 - [CF 1080D]Olya and magical square
Olya and magical square - 竞赛题解 借鉴了一下神犇tly的博客QwQ(还是打一下广告) 终于弄懂了 Codeforces 传送门 『题目』(直接上翻译了) 给一个边长为 \( ...
- [题解] [CF 1250J] The Parade
题面 题目大意: 给定一个 \(n\) , 所有军人的数量均在 \([1, n]\) 给定 \(a_i\) 代表高度为 \(i\) 的军人的个数 你要将这些军人分成 \(k\) 行, 满足下面两个条件 ...
- 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T4(模拟)
随便模拟下就过了qwq 然后忘了特判WA了QwQ #include <cstdio> #include <algorithm> #include <cstring> ...
- 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T3(贪心)
是一道水题 虽然看起来像是DP,但其实是贪心 扫一遍就A了 QwQ #include <cstdio> #include <algorithm> #include <cs ...
- 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T2(模拟)
题目要求很简单,做法很粗暴 直接扫一遍即可 注意结果会爆int #include <cstdio> #include <algorithm> #include <cstr ...
- 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T1(找规律)
就是找一下规律 但是奈何昨天晚上脑子抽 推错了一项QwQ 然后重新一想 A掉了QwQ #include <cstdio> #include <algorithm> #inclu ...
- 题解 CF 1372A
题目 传送门 题意 构造一个长度为n的数组,对于数组中的元素a,b,c,满足\(a+b\neq c\). 思路 直接让数组中的数全部变成1就可以了(其他数也行). 代码 /* * Author :We ...
随机推荐
- Elasticsearch的query phase和fetch phase
对于一次query查询到数据返回到客户端,经历了两个过程 query phase和fetch phase的过程 query phase 查询阶段 fetch phase 获取阶段. 1 qu ...
- 四层发现-TCP和UDP发现简介
虽然这里使用到了端口发现,但是四层发现阶段并不对端口进行解析,而是通过端口进行对ip是否存活的判断. 这里是对主机的发现,而不是对端口的识别. 四层发现的结果比三层发现的结果更加精确,基本不会被防火墙 ...
- Java 多线程基础(十二)生产者与消费者
Java 多线程基础(十二)生产者与消费者 一.生产者与消费者模型 生产者与消费者问题是个非常典型的多线程问题,涉及到的对象包括“生产者”.“消费者”.“仓库”和“产品”.他们之间的关系如下: ①.生 ...
- ceph对象存储RADOSGW安装与使用
本文章ceph版本为luminous,操作系统为centos7.7,ceph安装部署方法可以参考本人其他文章. [root@ceph1 ceph-install]# ceph -v ceph vers ...
- 作为一个Java开发你用过Jib吗
1. 前言 Jib是Google开发的可以直接构建 Java应用的Docker和OCI镜像的类库,以Maven和Gradle插件形式提供.它最骚操作的是可以在没有Docker守护程序的情况下构建,也就 ...
- 【Flutter 实战】简约而不简单的计算器
老孟导读:这是 [Flutter 实战]组件系列文章的最后一篇,其他组件地址:http://laomengit.com/guide/widgets/Text.html,接下来将会讲解动画系列,关注老孟 ...
- 痞子衡嵌入式:kFlashFile v1.0 - 一个基于Flash的掉电数据存取方案
大家好,我是痞子衡,是正经搞技术的痞子.今天给大家带来的是痞子衡的个人小项目 - kFlashFile. 痞子衡最近在参与一个基于 i.MXRT1170 的项目,项目有个需求,需要在 Flash 里实 ...
- 洛谷 P1313 【计算系数】
这道题只要肯动手还是挺水的 进入正题 我们先枚举几个找找规律(这里先省略x,y): k = 0 :\(1\) k = 1 : \(a\) \(b\) k = 2 : \(a^{2}\) \(2ab\) ...
- 发家致富的鬼bug。让人心动
这个bug是我目前见过最离谱的bug…… 颠覆了我二十多年的世界观,天上掉馅饼这种好事第一次砸我身上(雾),至今我都没想明白其中的原理. 情况是这样的,去年我出门去外地有些事情要处理.由于要呆很长时间 ...
- Asp.Net Core Blazor之容器部署
写在前面 Docker作为开源的应用容器引擎,可以让我们很轻松的构建一个轻量级.易移植的容器,通过Docker方式进行持续交付.测试和部署,都是极为方便的,并且对于我们开发来说,最直观的优点还是解决了 ...