盯著正方形的圖想了許久才靈光一閃
假設有個n*n的正方形
我們先用最小1*1正方形慢慢數,不難發覺,有n*n個
接下來2*2就得動點腦筋了。
我們從最左上角開始往右邊數
會發現當數到n-1次時,會數不下去
同理3*3當數到n-2次時,也一樣。
發現小正方形m*m在n*n正方形內所佔有的數量為(n-(m-1))*(n-(m-1))
而若要算小長方形的數量,用同樣的思考方式去想一樣容易許多
三維、四維也用同樣的思路即可
#include<stdio.h> #include<math.h> int main() { int n; while(scanf("%d", &n) == 1) { int i; long long int r[3]; r[0] = n * (n+1) * (2*n+1) / 6.0 + 0.5; r[1] = pow(n * (n+1) / 2.0, 2) + 0.5; r[2] =(6*pow(n, 5) + 15*pow(n, 4) + 10*pow(n, 3) - n) / 30.0 + 0.5; for(i = 0; i < 3; i++) { printf("%lld ", r[i]); printf("%lld", (long long int)(pow(n * (n+1) / 2.0, i+2) - r[i] + 0.5)); if(i != 2) putchar(' '); } putchar('\n'); } return 0; }
可以發現上方的代碼中有r[0]、r[1]、r[2]
這三個變數分別儲存∑(n, k=1)k^2、∑(n,
k=1)k^3、∑(n, k=1)k^4 (為了提高精度所以r[2]才這麼算的)
而∑(n,
k=1)k * ∑(n, k=1)k -∑(n, k=1)k^2是長方形的個數,若不懂這式子的涵義,可以試著去推導看看!
當然三維、四維也一樣用同個式子擴展。
很少寫過文章,總感敘述不清楚啊...(我不會說因為我懶的寫推導過程才叫讀者們自己想的)
若有任何疑問儘管提出來吧,只要在我能力範圍內的問題都會盡量回答的!