给定一个n*m的网格,求面积为奇数的正方形有多少个.

首先是n*m个面积为1的,然后剩下的要么是边长为奇数,要么被这样一个奇数边长所包围。

原因如下:

对于一个边长不平行于坐标抽的正方形,其边长一定是某个长方形的对角线,而且长方形长宽a,b一定是一奇数,一偶数,这样area = a^2+b^2才是奇数。

所以可以对任何奇数i <= min(n, m) 求出这样的边长正方形以及被包围的正方形个数。

注意对于一个奇数例如5,被包围的正方形可以是以1和4的对角线,2和3的对角线为边,这样对任何一个奇数i,被包围的正方形有i/2个,根据对称性还应该*2。

w-i+1表示宽方向能够移动的次数,l-i+1表示长度方向能够移动的次数,例如图5,长和宽方向均能移动2次。

ans = n*m(单位正方形) +

{2*(w-i+1)*(l-i+1)*(i/2) + (w-i+1)*(l-i+1)}    i为 3<=i<=min(n, m)的奇数。

后来在最后完成这篇博客的时候想到能不能把式子简化一下呢,然后化简就得到这个:ans = ∑{ (w*l+w+l+1)*i – (w+l+2)*i*i + i*i*i} i为1到min(l,w)之间的奇数。

甚至可以推广到面积为偶数的情况:

公式:ans = ∑{ (w*l+w+l+1)*i – (w+l+2)*i*i + i*i*i} i为1到min(l,w)之间的偶数。

如果是求所有的正方形个数的话,只要把i从1取到min(w,l)就行了。

注意程序中预处理一下i,i*i,i*i*i的和。

下面只上化简后公式实现的代码好了。

time:29ms

//Date: 20140211
#include <iostream>
#include <sstream>
#include <cstdio>
#include <climits>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <string>
#include <stack>
#include <map>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#define esp 1e-3
#define pi acos(-1.0)
#define inf 0x0f0f0f0f
#define pb push_back
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define mp(a, b) make_pair((a), (b))
#define in freopen("test_in.txt", "r", stdin);
#define out freopen("test_out.txt", "w", stdout);
#define bug puts("********))))))");
#define inout in out
#define stop system("pause");
#define PRD(a) printf("%d\n",(a))
#define PRLD(a) printf("%lld\n", (a))
#define PRID(a) printf("%I64d\n", (a))
#define PRU(a) printf("%u\n", (a))
#define PRLU(a) printf("%llu\n", (a))
#define PRIU(a) printf("%I64u\n", (a))
#define SET(a, v) memset(a, (v), sizeof(a))
#define READ(a, n) {REP(i, n) cin>>a[i];}
#define REP(i, n) for(int i = 0; i < (n); i++)
#define Rep(i, base, n) for(int i = base; i < n; i++)
#define REPS(s) for(int i = 0; s[i]; i++)
#define pf(x) ((x)*(x))
#define Log(a, b) (log((double)b)/log((double)a))
#define Srand() srand((int)time(0))
#define random(number) (rand()%number)
#define random_range(a, b) (int)(((double)rand()/RAND_MAX)*(b-a) + a) /*
1. 点分治,atan和atan2返回弧度值,atan值域为(-pi/2, pi/2), atan2值域为(-pi, pi) ;
2. exp(x)用于计算e^x ;
3. log2和log10分别用来计算对数, log默认以e为底 ;
4. sort中比较函数的原型:bool cmp(const Type &a, const Type &b);
5. lower_bound和upper_bound返回的是相应下标对应的指针 ;
6. dfs时注意利用强剪枝和避免重复状态进行优化 ;
7. 尽量减少不必要的状态表示的维度 ;
8. greater<T> () less<T> () ;
9. 尽量少用strlen,尤其是在递归深度较大,字符串较长的时候,容易超时;少用memset ;
10.不要在函数里面开数组,易暴栈 ;
*/ using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef pair<int,int> pii;
typedef vector<pii> VII;
typedef vector<pii, int> VIII;
typedef VI:: iterator IT;
typedef map<string, int> Mps;
typedef map<int, int> Mpi;
typedef map<int, pii> Mpii;
typedef map<pii, int> Mpiii; template<class T> inline const T& Max(const T& a, const T& b)
{
return a < b ? b : a;
}
template<class T> inline const T& Min(const T& a, const T& b)
{
return a < b ? a : b;
}
template<class T> inline void checkMax(T& a, const T& b)
{
if(a < b) a = b;
}
template<class T> inline void checkMin(T& a, const T& b)
{
if(a > b) a = b;
} const int maxn = + ;
LL f[maxn], g[maxn], h[maxn];
void pre()
{
f[] = g[] = h[] = ;
for(int i = ; i < maxn; i += ) {
f[i] = f[i-] + i;
g[i] = g[i-] + (LL)i*i;
h[i] = h[i-] + (LL)i*i*i;
}
}
int main()
{ LL n, m;
pre();
while(scanf("%lld%lld", &n, &m), n||m) {
LL k = min(n, m);
if((k&) == )
k--;
LL ans = (n*m+n+m+)*f[k]-(n+m+)*g[k]+h[k];
printf("%lld\n", ans);
}
return ;
}

UVALive 6602 Counting Lattice Squares的更多相关文章

  1. UVaLive 6602 Counting Lattice Squares (找规律)

    题意:给定一个n*m的矩阵,问你里面有几面积为奇数的正方形. 析:首先能知道的是,大的矩阵是包括小的矩阵的,而且面积为奇数,我们只要考虑恰好在边界上的正方形即可,画几个看看就知道了,如果是3*3的有3 ...

  2. UVALive 5058 Counting BST 数学

    B - Counting BST Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit S ...

  3. UVALive 5058 Counting BST --组合数

    题意:排序二叉树按照数插入的顺序不同会出现不同的结构,现在要在1~m选n个数,使按顺序插入形成的结构与给出的结构相同,有多少种选法. 解法:先将给出的结构插入,构造出一棵排序二叉树,再dfs统计,首先 ...

  4. UVALive 3295 Counting Triangles

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  5. UVALIVE 3571 Visible Lattice Points

    就欧拉函数然后地推一下. #include <map> #include <set> #include <list> #include <cmath> ...

  6. UVALive 6527 Counting ones dfs(水

    题目链接:点击打开链接 #include <cstdio> #include <vector> using namespace std; typedef long long l ...

  7. Individual Contest #1 and Private Training #1

    第一次的增补赛,也是第一场个人排位赛,讲道理打的和屎一样,手速题卡了好久还WA了好多发,难题又切不出来,这种情况是最尴尬的吧! Individual Contest #1: Ploblem D: 题意 ...

  8. Rocky(dfs)

    题目描述 Sylvester Stallion is an old horse who likes nothing better than to wander around in the fields ...

  9. The 2013 South America/Brazil Regional Contest 题解

    A: UVALive 6525 cid=61196#problem/A" style="color:blue; text-decoration:none">Atta ...

随机推荐

  1. Linux命令行程序和内建指令

    摘录百度分类 文件系统 cat cd chmod chown chgrp cksum cmp cp du df fsck fuser ln ls lsattr lsof mkdir mount mv ...

  2. zabbix数据存储

    一.zabbix数据库 zabbix-server将采集到的数据存储在数据库中,最常用的Mysql,数据存储的大小和每秒处理的数据量有关,数据存储取决于每秒处理的数据量和Housekeeper的删除数 ...

  3. 重叠I/O之使用完成例程的扩展I/O【系列二】

    一 废话 在上一篇文章中,我们介绍了通过等待内核对象来接受I/O完成通知的重叠I/O.除了使用同步对象外,我们还可以使用其它方法,这便是这篇文章要介绍的使用完成例程的扩展I/O.完成例程其实就是回调函 ...

  4. Asp.net网页中禁止使用剪切、复制、粘贴的方法

    工欲善其事,必先利其器 在asp.net开发的网页中,有时候需要禁止用户粘贴复制密码,禁止用户copy文章直接粘贴到文本框中.采取的方法是直接在限制控件的地方写上禁止粘贴文本的代码.但是这样不是很方便 ...

  5. 第十三篇、jQuery Mobile

    API-->搜索data 0.page data-transition="slide" // 页面切换效果 data-position="fixed" / ...

  6. JavaScript学习笔记(7)——JavaScript语法之函数

    函数就是包裹在花括号中的代码块,前面使用了关键词 function: function functionname() { //这里是要执行的代码 } 当调用该函数时,会执行函数内的代码. 可以在某事件 ...

  7. 【转】图解SQL的各种连接join

    原帖地址:http://www.nowamagic.net/librarys/veda/detail/936 图解SQL的各种连接join 让你对SQL的连接一目了然 在 2011年12月22日 那天 ...

  8. spring mvc 全局异常处理

    package com.tool; public class MyException extends Exception{ public String Msg; public String ErrCo ...

  9. 【开发】Dialog 对话框

    提示:Dialog 继承自 Panel,有大量的方法在 Panel 中已被定义,可以复用. Dialog API:http://www.jeasyui.net/plugins/181.html Pan ...

  10. Python快速入门学习笔记(二)

    注:本学习笔记参考了廖雪峰老师的Python学习教程,教程地址为:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb49318210 ...