H. I Would Walk 500 Miles
题目链接
题目大意:
将N头牛分成K组,要求你求出任意两组牛中任意两头牛能相遇的最短距离M。已知两头牛x和y愿意走去看对方的距离是
(2019201913x+2019201949y) mod 2019201997(x<y),
问M是多少(M尽可能大)。
思路:
题目意思就是求最小值的最大值。
这是有规律可循的,比如编号越小的牛与同一编号的牛的距离M就越大,即两头牛的编号越小,M就越大,利用这一规律,我们可以把牛这样子分组,前k-1头牛分成一头牛一组,剩余的牛为一组,这样子第k-1头牛与第n头牛的组合的M就是所有组合里面最小的,并且也是分成k组的所有方案中,M最大的一个。
代码:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const ll x1=2019201913;
const ll x2=2019201949;
const ll mod=2019201997;
int main(){
ll n,k;
cin>>n>>k;
ll c=k-1;
printf("%lld\n",(c*x1+n*x2)%mod);
}