1. 程式人生 > 其它 >CF #549 D. The Beatles

CF #549 D. The Beatles

題意:由1到N個節點組成一個環,從節點1開始,每隔k個節點有一個餐館(1也有餐館)

現給出4個數據n,k,a,b

n為餐館的數量,k為餐館之間的間隔距離,a為起始位置距離最近餐館的距離,b為走了一步(步數未知)後距離最近餐館的距離

思路:這題的未知數是每步所走路徑l,我們可以把它先設為未知量l

對於走回原點次數,可以手算模擬一遍,當l為1,環長度為6,總共需要6次

當l為2,需要3次,當l為3,需要2次,而l為4次時,需要3次,l為5次時,需要6次

由此我們可看出規律,得出公式:t=(n*k)/gcd(n*k,l)

接下來我們再來求l,我們可以推匯出l=m+c

m我們討論一下

對1 0 0 0 0 1 0 0 0 0 1 0 0 0 0

給出的資料時k=5,a=2,b=1;

a=1,b=2時,l是1,2,4,7

a=1,b=1時,l是0,3,5,8

可猜測l分別為|a-b|,k-a-b,k-a+b,2k-a-b

c為k的倍數,只需要列舉下從0到n的k倍數即可

#pragma GCC optimize(2)
#pragma GCC optimize(1)
#include<bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
const ull base=131;
#define MAX 100009
#define PI 3.141592653589793
using
namespace std; int main() { std::ios::sync_with_stdio(false); std::cin.tie(0);std::cout.tie(0); ll n,k,a,b; cin>>n>>k>>a>>b; ll circle=n*k,L[4]={abs(a-b),k-a-b,k-a+b,2*k-a-b}; ll mx = LLONG_MIN, mi = LLONG_MAX; for(ll i=0;i<4;i++){ ll temp
=L[i]; for(ll j=0;j<n;j++,temp+=k){ mx=max(mx,abs(__gcd(circle,temp))); mi=min(mi,abs(__gcd(circle,temp))); } } cout<<circle/mx<<' '<<circle/mi<<"\n"; }