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;
}