暴力枚举专题之统计方形

P2241 统计方形(数据加强版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

你以为这篇文章的标题是暴力枚举那么我们就直接枚举长方形和正方形的数量吗,nonono,小伙子(小美女),洛谷哪会这么善良,不要太天真了哟!

回归原题,我们思考怎么枚举正方形,我们知道正方形的边长是我们一点更要枚举的,那当我们知道了正方形的边长后该怎么办呢。

我先给的大家结论后解释

aa=a*b;

for(e=2;e<=dmin;e++) {
	f=(a-(e-1))*(b-(e-1));	
			aa=aa+f;	
}

大家可以看到正方形的边长可以是1就是所有小个子的数量,所以我们直接加上所有小格子的数量即可。关键问题在于我们的公式是怎么的的。

 

我们拿表格为例,假设我们的边长为2,那我们四行四列,我们先从第一行入手,我们发现当正方形的上边在1时,我们会令正方形先占据第一和第二列,接下来我们让他占据第2和第3列接着是第3和第四列,发现规律了吗,我们除了第一次我们直接占据了两个新列以外,其余我们都只占了一个新的列,所以以前两行为例,当边长为2时我们的公式就是

(b-(e-1))

那么这是前两行,我们总共能放置几行呢,跟列一个原理除了第一次新站2行外此后每个都只占1行,推广开来,我们令行和列减去第一次多占的行或列乘以对应的行和列即可。大家可以亲自拿纸来推推哦


import java.awt.FontFormatException;
import java.io.BufferedReader; 
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.AnnotatedWildcardType;
import java.math.BigInteger;
import java.net.DatagramPacket;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Spliterator.OfPrimitive;
import java.util.function.IntToDoubleFunction;
import java.util.function.LongBinaryOperator;
import java.util.TreeMap;
import java.util.TreeSet;
import javax.management.relation.InvalidRelationTypeException;
import javax.print.attribute.standard.JobMessageFromOperator;
import javax.print.attribute.standard.JobPriority;
import javax.swing.plaf.ColorChooserUI;
import javax.swing.table.TableModel;
import javax.swing.text.TabSet;
import javax.xml.crypto.dsig.spec.DigestMethodParameterSpec;
public class Main {
  public static void main(String[] args) throws IOException  {
Scanner sc=new Scanner(System.in);
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw1=new PrintWriter(System.out);
String[] aStrings=br1.readLine().split(" ");
int a=Integer.parseInt(aStrings[0]);
int b=Integer.parseInt(aStrings[1]);
aa=a*b;
int cmax=Math.max(a, b);
int dmin=Math.min(a, b);
int e,f,g,h;
for(e=2;e<=dmin;e++) {
	f=(a-(e-1))*(b-(e-1));	
			aa=aa+f;	
}

for(e=1;e<=a;e++) {
	for(f=1;f<=b;f++) {
		if(e!=f) {
			bb=bb+(a-(e-1))*(b-(f-1));
		}
	}
}
System.out.println(aa+" "+bb);
}
  public static long aa=0;
  public static long bb=0;
 }
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值