Codeforces Round #549 (Div. 2) D 數學
阿新 • • 發佈:2019-05-03
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 數學