原题
题目大意
两只不同组的牛会走 ( 2019201913 x + 2019201949 y ) % 2019201997 (2019201913x+2019201949y)\%2019201997 (2019201913x+2019201949y)%2019201997里来找对方,找到一种分组方案,让它们找到其它牛要走的路径最大
题目分析
一开始看不懂……数字有点大,但其实是唬人的(然后我打了个exgcd)
虽然说是分组,但是要让牛牛们的距离尽量大,只需让比较小的都在同一组里面,其它牛一个成一组就行了
一只牛也只用记录对它而言离他最近的牛,因为离他更远的要不是没啥事,要不是被其它牛记录了
总的来说就是贪心
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#define min(a,b) (a < b ? a : b)
long long const a = 2019201913,b = 2019201949,p = 2019201997;
int mindis[7501];
bool cmp(int a,int b)
{
return a > b;
}
int calcDis(long long x,long long y)
{
return (int)((a * x + b * y) % p);
}
int main()
{
long long n,k;
memset(mindis,0x7f,sizeof(mindis));
scanf("%lld%lld",&n,&k);
for (int i = 1;i <= n;++i)
{
for (int j = i + 1;j <= n;++j)
{
int t = calcDis(i,j);
mindis[i] = min(mindis[i],t);
mindis[j] = min(mindis[j],t);
}
}
std::sort(mindis + 1,mindis + n + 1,cmp);
printf("%d",mindis[k - 1]);
return 0;
}