洛谷地址:https://www.luogu.com.cn/problem/P1372
题意:
简单来讲,就是在1~n中,找k个使得它们的gcd最大
解析:
一数学分析:
假设第一个为x
那么有2x,3x,4x,....kx
kx<=n
则:x<=n/k
n/k即为答案
#include<bits/stdc++.h>
#include<map>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=2e3+10;
const int maxn2=20;
int mp[maxn][maxn];
int answ[maxn];
int md[maxn];
int main()
{
ll n,k;
cin>>n>>k;
cout<<n/k<<endl;
}
二:二分做法
还是之前的寻找方法,x,2x,3x...kx,二分mid,mid*k与n进行比较来调整L,R
又把二分写死了。。。。
跳出条件:L+1<R
就拿6,3来讲,不这么搞,会死在[1,2]中跳不出来
#include<bits/stdc++.h>
#include<map>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=2e3+10;
const int maxn2=20;
int mp[maxn][maxn];
int answ[maxn];
int md[maxn];
int main()
{
ll n,k;
cin>>n>>k;
ll l=1,r=n;
while(l+1<r)
{
// cout<<l<<" "<<r<<endl;
ll md=(l+r)>>1;
if(md*k>n)
r=md-1;
else
l=md;
}
if((l+1)*k<=n)
cout<<l+1<<endl;
else
cout<<l<<endl;
}