有 n 头奶牛,有 k 个木桩,每个木桩有一个位置,一个木桩上只能拴一头奶牛。由于奶牛好斗,所以在拴奶牛的时候,要求距离最近的奶牛的距离尽可能大。
例如 n=4,k=6,木桩的位置为 0,3,4,7,8,9,此时为下图。
\underline\text{\qquad O\quad l\quad l\quad O\quad O\quad l\quad l\quad O\quad O\quad O\qquad}\\ \text{\qquad 0\quad\ \quad\ \ \quad 3\ \quad 4\quad\quad\quad\quad 7\quad\ 8\quad\ 9\qquad}\\有许多种拴牛方案,例如:
三个整数 n,k,p1,其中 p1 为第 1 个木桩的位置,其他木桩 pi(i≥2) 的位置由下面公式给出:
pi=pi−1+((pi−1×2357+137)mod10)+1。
一个整数,即奶牛间最近距离的最大值。
25 70 99
12
1≤n≤k≤106,0≤p1≤100。
#include<bits/stdc++.h>
using namespace std;
long long n,k,s1;
long long p[1000010];
bool check(long long x)
{
long long index=1,cnt=1;
for(long long i=2;i<k;i++)
{
if(p[i]-p[index]>=x)
{
index=i;
cnt++;
}
}
if(cnt>=n)
{
return true;
}else
return false;
}
int main()
{
cin>>n>>k>>s1;
p[1]=s1;
for(long long i=2;i<=70;i++)
p[i]=p[i-1]+((p[i-1]*2357+137)%10)+1;
sort(p+1,p+k+1);
long long l=1,r=p[k];
while(l<r)
{
long long mid=(l+r+1)>>1;
if(check(mid))
{
l=mid;
}else
r=mid-1;
}
cout<<l;
}