P2241 統計方形(數據加強版) - 洛谷 | 計算機科學教育新生態 (luogu.com.cn)
1.矩形、正方形數量公式:
運用小學時代的公式(設長為n,寬為m):
(1+2+3+...+n)(1+2+3+...+m)
或
nm(n+1)(m+1)/4(等差數列的化簡)
即可算出長方形個數。下面給出證明(請看上圖):
在AD中,單位長度為1的有兩個,AJ,JD。單位長度為2的有一個,AD。同理,AB中單位長度為1的有三個,單位長度為2的有兩個,單位長度為3的有一個。
每一種情況對應着鄰邊的所有情況。比如AJ對應AE,EF,FB,AF,EB,AB 就是AB中的所有情況!這樣就可以推導出上方的兩個公式。
那正方形怎么求呢?其實,正方形就是上方公式的特殊情況,即單位長度相等的情況。可以有公式 ( n - i + 1 ) * ( m - i + 1) 求和----- i 的范圍為[ 1 , min ( n , m ) ]
2.正方形數量計算:
假設圖形之前正方形總數為sum1,若圖形橫向或縱向擴展一格,此時右下角坐標為 [ i , j ],那么擴展后的圖形中正方形最多有sum1+min( i , j )個
3.矩形數量計算:
假設圖形之前矩形總數為sum2,若圖形橫向或縱向擴展一格,此時右下角坐標為 [ i , j ],那么擴展后的圖形中矩形最多有sum2+i * j 個

1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int main() 5 { 6 int n,m; 7 scanf("%d%d",&n,&m); 8 long long x=n*(n+1)/2,y=m*(m+1)/2; 9 10 int minn=min(n,m),maxx=max(n,m); 11 12 long long sum1=0; 13 for(int i=1;i<=minn;i++) 14 sum1+=(n-i+1)*(m-i+1); 15 16 printf("%lld %lld",sum1,x*y-sum1); 17 18 return 0; 19 }

1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int main() 5 { 6 int n,m; 7 scanf("%d%d",&n,&m); 8 9 long long ans1=0,ans2=0; 10 for(int i=1;i<=n;i++) 11 { 12 for(int j=1;j<=m;j++) 13 { 14 ans1+=min(i,j); 15 ans2+=i*j; 16 } 17 } 18 19 printf("%lld %lld",ans1,ans2-ans1); 20 return 0; 21 }