题目
Farmer John想要将他的编号为 1…N的N头奶牛( N≤7500 )分为非空的 K 组( 2≤K≤N ),使得任意两头来自不同组的奶牛都需要走一定的距离才能相遇。奶牛 x 和奶牛 y(其中 1≤x<y≤N )愿意为了见面走(2019201913x+2019201949y)mod2019201997 英里。
给定一个将 N 头奶牛分为 K 个非空小组的分组方案,令 M 为任意两头来自不同组的奶牛愿意为了见面行走的英里数的最小值。为了测试奶牛们相互之间的忠诚度,Farmer John想要将 N 头奶牛以最佳的方式分为 K组,使得 M尽可能大。
解法
令 t = 2019201997,那么(2019201913x+2019201949y)mod2019201997
就等价于 ( (t-84)x + (t-48y) + t ) mod t
化简一下就是 -84x - 48y + t
然后就开始贪心了,奶牛为了使得这个值最小,那么x, y肯定会尽可能的大,所以y必定等于n(-84n 比-48n小),这个时候奶牛就想用第n-1头了,但是我们可以把这头奶牛和n放在同一组,这样n-1就不能用了(有点坏坏的感觉),然后奶牛就想用n-2…依次类推,当我们处理第k-1头奶牛的时候,我们就放不进去了,因为剩下的k-2头奶牛是组不了k-1组的,所以k-1的奶牛就必须放在外面,奶牛得而用之,答案就是 (-84*(k-1) - 48*n + mod) % mod;
代码
#include <iostream>
#include <cmath>
#include <queue>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int mod = 2019201997;
int main() {
long long int n, k, ans;
cin >> n >> k;
ans = (-84*(k-1) - 48*n + mod) % mod;
cout << ans;
return 0;
}