题解 CF32C 【Flea】
Accepted_Z · · 题解
打个小广告:点我
以下正文:
思路
我们用a和b来记录行和列用步数整除后分别还剩下几格,也就是a=n%s,b=m%s
然后再用c和d来记录用步数可以把行列分别分成几段,也就是c=n/s,d=m/s
其中:a加c乘s等于n,b加d乘s等于m
于是我们便可以很容易地发现:a和b是c和d除以s以后的余数。
所以a和b就被活生生的浪费掉了。但是为了得到最大值,我们就必须要把a和b利用起来。我们浪费a和b的根本原因是只把一个点作为了起点。如果我们能够把好几个点都作为起点,就能让行和列分成的段数(c和d)的值加一,只不过每次取的格子是余数,而不是每段格子数。
最后在输出a乘b乘c乘d的值,就233啦。
注意
(1)如果a或b的值是0,那行或列中的每段我们都可以挑,这时a=s或b=s
(2)本题测试数据较大,需要开long long
代码
以下是我的超短萌新代码
#include <bits/stdc++.h>//万能头文件
using namespace std;
long long n,m,s,a,b,c,d;
int main()
{
cin>>n>>m>>s;//输入
a=n%s;b=m%s;//初始化a和b的值
c=n/s;d=m/s;//初始化c和d的值
if(a==0) a=s;//特判a等于0的情况
else c++;//否则就把c的段数加一
if(b==0) b=s;//特判b等于0的情况
else d++;//否则就把d的段数加一
cout<<a*b*c*d;//输出
return 0;//233啦
}