1. 程式人生 > >題解報告:hdu 1220 Cube

題解報告:hdu 1220 Cube

std color 思路 OS 對數 sin main 計算 div

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1220

問題描述

  Cowl擅長解決數學問題。 有一天,一位朋友問他這樣一個問題:給你一個邊長為N的立方體,它被與其側面平行的平面切割成N * N * N個單位立方體。 兩個單位立方體可能沒有共同點或兩個共同點或四個共同點。 你的工作是計算有多少對不超過兩個公共點的單位立方體。處理到文件的結尾。

輸入

  會有很多測試用例。 每個測試用例只會在一行中給出一個立方體的邊長N. N是正整數(1 <= N <= 30)。

輸出

   對於每個測試用例,您應該在一行中輸出上面描述的對的數量。

示例輸入 1 2 3

示例輸出 0 16 297

暗示 :結果不會超過int類型。

解題思路:這是一道組合數學題。題目的意思就是有一個N*N*N的立方體,將其分成1*1*1的單位立方體,則任意兩個立方體的交點(頂點)個數為0,1,2,4個,現在要求交點數小於等於2個的立方體對數有多少對。N*N*N的立方體可以分成N*N*N個單位立方體,而任選兩個立方體組成的情況一共有C(N*N*N,2)對 (即:N^3*(N^3-1)/2對)。公共點為4的對數:一列有n-1對(n個小方塊,相鄰的兩個為一對符合要求),一個面的共有 n^2列,選上面和左面,前面三個方向,同理可得,故總數為:3*n^2(n-1)。所以不超過兩個公共點的單位立方體的對數為

N^3*(N^3-1)/2-3*n^2(n-1)。

AC代碼:

1 #include<bits/stdc++.h>
2 using namespace std;
3 int main()
4 {
5     int n;
6     while(cin>>n)
7         cout<<(n*n*n*(n*n*n-1)/2-3*n*n*(n-1))<<endl;//推導公式
8     return 0;
9 }

題解報告:hdu 1220 Cube