2017.07.08【NOIP提高组】模拟赛B组 长方形(rectangle) 题解

原题:

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
#include
#include
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)+(ym) 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);
}

你可能感兴趣的:(2017.07.08【NOIP提高组】模拟赛B组 长方形(rectangle) 题解)