找回密码
 欢迎注册
楼主: chyanog

[提问] N×N的方格,里面有多少个长方形?

[复制链接]
发表于 2013-3-16 08:25:22 | 显示全部楼层
考虑矩形右上角坐标$(x, y)$,  $(x_0, y_0)$ 为矩形内部一点,作为非平行于坐标轴的矩形的左下顶点

$x_1 = x_0 - n_1k_2$   $y_1 = y_0 + n_1k_1$ 为左上点  
$x_2 = x_0 + n_2k_1$   $y_2 = y_0 + n_2k_2$  为右下点
$x_3 =x_2-n_1k_2 =x_0+n_2k_1-n_1k_2$ $y_3 =y_2+n_1k_1=y_0+n_2k_2+n_1k_1$ 为右上点

然后,所有点都在矩形区域内的情况就是符合条件的点

$0 <= x_0, x_1, x_2, x_3 <= x$
$0 <= y_0, y_1, y_2, y_3 <= y$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-16 20:52:14 | 显示全部楼层
现在我们考虑一种简化的计数形式

考虑对一组$n_1, n_2,k_1, k_2$组成的矩形$Q$
$Q$是被围在一个边平行于原始矩形的矩形$Q_s$里的

显然$Q_s$的坐标由下列值确定
$x_l = min(x_0, x_1)$  $y_b = min(y_0, y_2)$
$x_r = max(x_2, x_3)$  $y_t = max(y_1, y_3)$

由此,只需要确定$Q_s$在原矩形中能容纳多少个,
即可确定具体的$n_1, n_2,k_1, k_2$组成的矩形$Q$在原矩形中的数量
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-16 21:05:00 | 显示全部楼层
很容易知道,只要计算类型一即可

简单计算可以得到,$Q_s$的边长分别为
$n_1k_2+n_2k_1$, $n_2k_2+n_1k_1$
假设原始矩形边长分别为$m$,$n$
$1<=k_1, k_2<=min(m,n)-1$
$1<=k_1 + k_2 <= max(m + n)$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-17 12:03:04 | 显示全部楼层
以下函数将计算非平行于四边的矩形

let countk (x, y) = if (x<=1 || y<= 1) then 0 else (sum [s |let mxy = (min x y), k1<-[1..(mxy-1)], k2<-[1..(mxy-1)], k1+k2<=(max x y), gcd k1 k2 == 1,let km = min k1 k2, n1<-[1..(div x km)], n2<-[1..(div y km)], (n1*k2+n2*k1)<=x, (n1*k1+n2*k2)<=y, let xl=x-(n1*k2+n2*k1)+1, let yl=y-(n1*k1+n2*k2)+1, let s=xl*yl])

前30的结果
map (\x-> (x, countk (x, x))) [0..30]
[(0,0),(1,0),(2,1),(3,8),(4,30),(5,88),(6,199),(7,408),(8,748),(9,1280),(10,2053),(11,3168),(12,4666),(13,6712),(14,9363),(15,12728),(16,16952),(17,22256),(18,28681),(19,36536),(20,45870),(21,56936),(22,69967),(23,85264),(24,102860),(25,123232),(26,146557),(27,173128),(28,203138),(29,237192),(30,275243)]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-17 15:52:52 | 显示全部楼层
countk (128, 128)
150128992

即边长128的正方形里共有
150128992 + (128*129/2)^2 = 218290528
个由格点组成的矩形
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-17 15:55:34 | 显示全部楼层
现在考虑三维立方体情况

显然,边长分别为$x$, $y$, $z$的立方体
内部格点做顶点的平行于立方体六个面的立方体的个数是
${xyz(x+1)(y+1)(z+1)}/8$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-17 19:00:47 | 显示全部楼层
然后是有一个面平行的情况

假设平行于$x, y$轴组成的平面
则结果是(以上面平面时的函数count2计算)
countk (x, y) * (div (z*(z+1) 2)^2
同理可以对其他2个面做此计算,即一共有
countk (x, y) * (div (z*(z+1) 2)^2 + countk (x, z) * (div (y*(y+1) 2)^2 + countk (z, y) * (div (x*(x+1) 2)^2
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-17 19:01:54 | 显示全部楼层
然后最后一种情况是所有平面都不平行情况,这个就复杂了。。。
计算了一个下午也得不到类似平面时候的三线垂直的方程来。。。。
求大牛给出坐标方程来。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-17 19:04:32 | 显示全部楼层
以2X2X2为例
所有面平行是 (2*3/2)^3 = 27个
有一个平行,是  3*1*(2*3/2) = 9个
都不平行,有0个
一共36个

未确认结果,待修改
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-3-18 11:35:16 | 显示全部楼层
决定暴力搜索,用了个外部库求所有因子
原理是,
$(a, b, -c)$, $(x, y, z)$如果垂直,则
$ax + by + cz = 0$
然后枚举所有$a$, $b$, $x$, $y$的组合
求$t = ax + by$的一个因子c
则$z=t/c$
加上第三组,得到全部的三组向量
$(a,b,c)$,$(x,y,z)$,$(bz-cy,cx-az,ay-bx)$


Prelude Math.NumberTheory.Primes Data.List Data.Set> let d3 n = [(a,b,c,x,y,z)|a<-[1..n-1],b<-[1..n-1],gcd a b == 1, x<-[1..n-1],y<-[1..n-1], gcd x y == 1, let t=a*x+b*y, c<-(toList tl), c < n, let z=div t c, z< n]

该函数经验证还是存在问题啊。。。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-28 08:10 , Processed in 0.081868 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表