1. 程式人生 > >Codeforces Round #549 (Div. 2) D 數學

Codeforces Round #549 (Div. 2) D 數學

max turn http cpp 最大 ref spa i++ force

https://codeforces.com/contest/1143/problem/D

題意

有nk個城市,第1,k+1,2k+1,...,(n-1)k+1城市有餐廳,你每次能走l距離,a為起始位置離最近餐廳的距離,b為走了一次後離最近餐廳的距離,給出n,k,a,b,求你回到起點最少和最多停留次數

題解

  • \(yl=xnk,有y=xnk/l,即y=lcm(xnk,l)/l\)
  • 枚舉a(兩種情況),b(兩種情況),維護最大,最小值

代碼

#include<bits/stdc++.h>
#define ll long long  
using namespace std;
ll n,k,a,b,p,d,mx=-1e17,mi=1e17;
ll gcd(ll a,ll b){
    if(b>a)swap(a,b);
    if(b==0)return a;
    else return gcd(b,a%b);
}
ll lcm(ll a,ll b){
    return a/gcd(a,b)*b;
}

int main(){
    cin>>n>>k>>a>>b;
    for(ll i=0;i<n;i++){
        p=b+i*k;
        if(p>n*k)p-=k;
        d=abs(p-a);
        mi=min(lcm(n*k,d)/d,mi);
        mx=max(lcm(n*k,d)/d,mx);    
    }
    for(ll i=0;i<n;i++){
        p=(k-b)+i*k;
        if(p>n*k)p-=k;
        d=abs(p-a);
        mi=min(lcm(n*k,d)/d,mi);
        mx=max(lcm(n*k,d)/d,mx);    
    }
    a=k-a;
    for(ll i=0;i<n;i++){
        p=b+i*k;
        if(p>n*k)p-=k;
        d=abs(p-a);
        mi=min(lcm(n*k,d)/d,mi);
        mx=max(lcm(n*k,d)/d,mx);    
    }
    for(ll i=0;i<n;i++){
        p=(k-b)+i*k;
        if(p>n*k)p-=k;
        d=abs(p-a);
        mi=min(lcm(n*k,d)/d,mi);
        mx=max(lcm(n*k,d)/d,mx);    
    }
    cout<<mi<<" "<<mx;
}

Codeforces Round #549 (Div. 2) D 數學