题目链接:http://codeforces.com/problemset/problem/965/C
题意:k个人围成一个圈分n个糖, 选择一个x,从第一个人开始一个一个的得到x个糖,直到剩下的不足x个。求第一个人最多能拿到多少
要求x小于等于M,每个人最后D*X个
思路:
Xmax = M, Xmin = n / (D * k + 1) + 1;
ans = (n/x/k + n/x%k == 0 ? 0 : 1) *x
n/x在一定范围内变化括号内的值不变,只与x的值有关,所以可以尝试枚举n/x
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n, k, M, D;
cin >> n >> k >> M >> D;
long long Max, Min, ans = -1, sym;
Max = M;
Min = n / (D * k + 1) + 1;
if(Max < Min)
{
cout << Max << endl;
}
else if(Max == Min)
{
long long tmp = n / Max;
cout << (tmp / k + (tmp % k == 0 ? 0 : 1)) * Min << endl;
}
else
{
sym = Max;
while(sym >= Min)
{
long long tmp = n / sym;
ans = max((tmp / k + (tmp % k == 0 ? 0 : 1)) * sym, ans);
if(tmp % k == 0)
{
tmp++;
}
else
{
tmp = (tmp / k + 1) * k;
}
sym = n / tmp;
}
cout << ans << endl;
}
return 0;
}