10.21T1 数学
Description
小B和小S准备参加学校最火爆的围棋社。作为资格考试,社长给他们出了一道题:给出一个有n条水平线与m条竖直线构成的棋盘(并不一定是传统围棋棋盘的19条线),然后他们有k枚棋子可以摆放到棋盘上的网格的交叉点上。我们定义一个方案的“赢面”为棋盘上四边与棋盘上的直线重合且四个角上都有棋子的矩形个数。小B和小S当然要尽量选出“赢面”最大的方案。不过他们还要学求导,背元素周期表,刷物理必刷题......所以他们向你求助。如果你成功帮助他们,就会得到巴蜀无限饭卡。
Input
输入一行仅三个数n,m,k。
Output
输出仅一行一个整数表示能得到的最大“赢面”。
Sample Input
输入1:3 3 8 输入2:7 14 86
Sample Output
输出1:5 输出2:1398
Hint
【数据规模】
对于50%的数据0<N,M≤30;
对于100%的数据0<N,M≤30000;K≤N*M。
对于50%的数据0<N,M≤30;
对于100%的数据0<N,M≤30000;K≤N*M。
简单的数学题,很显然,只有棋子摆在一起的时候答案才会最优,于是便很容易推出计算式子
枚举第一行的棋子个数,假设除最后一行外,其他都是i个
注意如果说余数超过m就不可行,可以在更后面被计算到
code:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int main(){ 5 long long n,m,k; 6 cin>>n>>m>>k; 7 long long ans=0; 8 for(long long i=2;i<=n;i++){ 9 long long l=k/i; 10 if(l>m)continue; 11 if(l==0)break; 12 long long rest=k%i; 13 if(rest>m)continue; 14 long long temp=(i-1)*i/2*(l-1)*l/2; 15 temp+=(rest-1)*rest/2*l; 16 ans=max(ans,temp); 17 } 18 cout<<ans; 19 return 0; 20 }
over