题目链接:http://acm.scu.edu.cn/soj/problem/4440/

题目大意:给一个n*m的方格,求周长小于等于k的矩形有多少个。 

解题思路:我之前直接暴力,显然超时,所以后来发现,可以用等差数列的求前n项和公式来代替一层for循环,这样就只有一重循环了,不会超时。

AC代码:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

int main()
{
 int n,m,k;
 long long sum;
 while(scanf("%d%d%d",&m,&n,&k)!=EOF)
 {
  sum=0;
  int c=2*(m+n);
  if(c<=k) sum=(long long)n*(n+1)*m*(m+1)/4;
  else
   {
    for(int i=1;i<=m;i++)
    {
     int j=(k-2*i)/2;
     if(j>0&&j<=n)
     {
      sum+=(long long)(n+n-j+1)*j/2*(m-i+1);
     }
     else
      if(j>n)
       sum+=(long long)(n+1)*n/2*(m-i+1);
    }
   }
  printf("%lld\n",sum);
 }
 return 0;
}