洛谷 P1372 又是毕业季I


程序说明

答案居然是n/k???(c++自带向下取整)
参考了别人的题解(侵删):

此题简化后就是:从1~n中取k个数,使这k个数的最大公约数最大
那么,我们索取的k个数之间应该具有某种倍数关系。
那么,如果我们把整个区间分成多个段,这些段的长度相同。这样就可以让它们的最大公约数尽量大。

因为,如果只有两个数,它们的最大公约数如果想要最大,那么只有在它们的差最接近最小的数的情况下最大公约数是最大的。一个数的最大公约数就是它本身,那么两个数的最大公约数就是它们两个数的最小值。

我们把n个数看做一个区间
如果k为2,那么只有两个数。这两个数应该为这个区间的中点和末尾。
如果k=3,那么要把区间分成三份。这三个数就是区间的1/3、2/3、末尾。
那么如果有k个数,就要把区间划分成k份。这k个数就是区间的1/k、2/k、3/k······n。

那么它们的最大公约数就是这些数的最大公约数。而k个数的最大公约数在它们具有倍数关系的情况下就是它们的最小值。也就是这些区间端点的最小的一个。那就是n/k。

代码如下:

#include <iostream>
using namespace std;
int main(void) {
    int n, k;
    cin>>n>>k;
    cout<<n/k;
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容