题目链接:http://acm.scu.edu.cn/soj/problem.action?id=4440
题意:给一个n*m的方格,求周长小于等于k的矩形有多少个。
解题思路:在长为n,宽为m的矩形上,长为i,宽为j的矩阵个数为(n - i + 1)x(m - j + 1),记j = k / 2 - i(j>0), k为周长, i为长, j为宽, 在j <= m时, j可以取1, 2, 3, …, j, 所以答案为 ans = (n - i + 1)x(m - 1 + 1) + (n - i + 1)x(m - 2 + 1) + … + (n - i + 1)*(m - j + 1),提取(n - i + 1), 就是一个等差数列, 所以 ans += (n - i + 1)x(2 * m - j + 1)j / 2;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
using namespace std;
#define LL long long
const LL INF = 0x3f3f3f3f3f3f3f3f;
int main()
{
LL m, n, k;
while (~scanf("%lld%lld%lld", &m, &n, &k))
{
k /= 2;
LL ans = 0;
for (LL i = 1; i <= n; i++)
{
if (i>k - 1) break;
LL x = k - i;
x = min(x, m);
ans = ans + (n - i + 1)*(m*x - (1 + x)*x / 2 + x);
}
printf("%lld\n", ans);
}
return 0;
}