洛谷地址: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; }