程序说明
答案居然是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;
}