0
点赞
收藏
分享

微信扫一扫

洛谷P1372 又是毕业季I(数论做法+二分做法)

独孤凌雪 2022-09-26 阅读 84

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

 



举报

相关推荐

洛谷-二分算法

0 条评论