小凯的疑惑’s 题解

这题的题解证明磨了本蒟蒻好几天,果然我太弱了

说实话,其实是很水啊,只要O1的算法…

(上句话当X处理)

此题来自HLOJ#925

这题想是真的恶心。

这道题主要是来锻炼大家的读题能力、心态以及…小学奥数水平…

悄悄告诉你,这题只要输入a,b,输出ab-a-b(当然这需要你尝试好几组数据凑出来)就可以了

怎么做?慢慢往下看吧。

我们可以画一个a列b行(假设a>b好了)的表格(当然你想行数大点也行,只是至少要b行),像这样
在这里插入图片描述
a的倍数全在最后一列,所以整列都可以表示为pa(p为正整数)的形式,而前面的都不能表示为pa的形式

而在前面的a-1列中,只要找到每列最小的能表示为qb(q为正整数)的形式,底下的所有数就能表示成pa+qb的形式

于是我们只要找到每列能表示成qb的形式的最小的数,然后再在这几个数中找最大值

在ab的范围中,每行只会有一个能表示为qb的数

而ab是已经属于能表示为pa的数了,所以(a-1)b即是每列能表示成qb的形式的最小的数中最大的那个数

所以不能表示为pa+qb的形式的最大数在(a-1)b的上一行的同一列的位置,为(a-1)b-a,即ab-a-b

如果还不懂,那我来举个例子…

以题中数据为例,7>3(a为7,b为3),所以作下图
在这里插入图片描述
于是先把能表示为pa形式的划了
在这里插入图片描述
然后把另外的能表示为qb形式的找出来
在这里插入图片描述
把这些数下面的划了
在这里插入图片描述
留下的白的就是不能表示的数,找到最大的为11(与结论吻合)

或者也可以根据上面的方法找到要找的(a-1)b为18,再找到18上方的11

加大此图!!!
在这里插入图片描述
最后,上代码…(其实不上也应该会打吧)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	freopen("math.in","r",stdin);
	freopen("math.out","w",stdout);
	long long a,b;
	cin>>a>>b;
	cout<<a*b-a-b;
	return 0;
}

又搬了一道。。。没了。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值