码迷,mamicode.com
首页 > 其他好文 > 详细

题解:ABC165 D

时间:2020-05-02 22:34:19      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:iostream   比赛   直接   names   spl   规律   cst   class   div   

前两题太水,不写了(其实都 \(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;
}

题解:ABC165 D

标签:iostream   比赛   直接   names   spl   规律   cst   class   div   

原文地址:https://www.cnblogs.com/tlx-blog/p/12819975.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!