數學知識——正方形、矩形數量的計算


 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 }
法二

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM