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

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

 

posted @ 2020-08-18 18:15  liyexin  阅读(192)  评论(0)    收藏  举报