这题的题解证明磨了本蒟蒻好几天,果然我太弱了
说实话,其实是很水啊,只要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;
}