题目链接: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; }