……

题解:ABC165 D

前两题太水,不写了(其实都 \(WA\) 了一次)。
很多人打表找规律,可我好懒啊,只能尝试证明一下了。

题意:求当 \(x\leq N\) 时,\(\left\lfloor\dfrac{Ax}{B}\right\rfloor-A\left\lfloor\dfrac{x}{B}\right\rfloor\) 的最大值。

比赛的时候理解错题意了......

先设:\(x<B\)

考虑:

\[\left\lfloor\dfrac{Ax}{B}\right\rfloor=\left\lfloor A(\dfrac{x}{B}-\left\lfloor\dfrac{x}{B}\right\rfloor)\right\rfloor+A\left\lfloor\dfrac{x}{B}\right\rfloor \]

至于为什么,您去想吧......
理解起来很简单。

那么我们要求的式子即为:

\[\left\lfloor A(\dfrac{x}{B}-\left\lfloor\dfrac{x}{B}\right\rfloor)\right\rfloor \]

的最大值。
显然最大化

\[\dfrac{x}{B}-\left\lfloor\dfrac{x}{B}\right\rfloor \]

即可。
那么当 \(x\) 最大时最大。

那么当 \(x<(k+1)B\) 时同理,由于整数部分在 \(\dfrac{x}{B}-\left\lfloor\dfrac{x}{B}\right\rfloor\) 是被抵消的。

那么当 \(x<B\) 是,带入 \(x\) 即可,否则直接取 \(b-1\) 即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;

#define read(x) scanf("%d",&x)
#define readl(x) scanf("%lld",&x)
#define ll long long 
#define ull unsigned long long

ll a,b,n;
ll x;

int main()
{
	cin>>a>>b>>n;
	if(n<b) x=n;
	else x=b-1;
	cout<<floor((double)a*(double(x)/b-floor(double(x)/b)))<<endl;
	return 0;
}
posted @ 2020-05-02 22:22  童话镇里的星河  阅读(184)  评论(2编辑  收藏  举报