原题:
http://172.16.0.132/senior/#contest/show/2041/0
题目描述:
鸡腿是CZYZ的著名DS,但是不想学数学的DS不是好GFS,所以鸡腿想通过提高数学水平来增强他的GFS气质!虽然你对鸡腿很无语,但是故事的设定是你帮助鸡腿增强了GFS气质,所以现在你必须教鸡腿学数学!
鸡腿想到了一个很高(sha)明(bi)的问题,在 N 条水平线与 M 条竖直线构成的网格中,放 K 枚石子,每个石子都只能放在网格的交叉点上。问在最优的摆放方式下,最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子。
输入:
一行输入三个正整数N,M,K。
输出:
一行输出一个正整数,表示最多的满足条件的长方形数量。
样例输入:
输入1:
3 3 8
输入2:
7 14 86
样例输出:
输出1:
5
输出2:
1398
数据范围限制:
对于50%的数据0 < N, M ≤ 30;
对于100%的数据0 < N, M ≤ 30000;K ≤ N*M。
分析:
这是一道纯数学题目,(没AC得都不知道他们在想些什么.....((/- -)/);
通过分析,我们不难得出一个公式:C(k/i,2)C(i,2)+C(k%i,2)k/i;
实现:
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int i,x,n,m,k;
long long ans;
long long calc(int x) {return (x-1)*x/2;}
long long work(int x,int y) {return calc(x)*calc(y)+(y<m?y:x)*calc(k-x*y);}
int main()
{
freopen("rectangle.in","r",stdin);freopen("rectangle.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
if(n>m) swap(n,m);
ans=0;
for(i=2;i<=min(n,(int)sqrt(k));i++)
{
x=min(m,k/i);
if(k>=x*(i+1)) continue;
ans=max(ans,work(i,x));
}
printf("%lld\n",ans);
}