F. Fitness Baker
F. Fitness Baker 數學
time limit per test0.5 se
memory limit per test256 megabytes
inputstandard input
outputstandard output
Baker is living in a new post-modern house. A house of size N consists of 5 wings arranged in a cross shape, where each wing contains NxN rooms. For example, a house of size N= 3 would be arranged as follows:
Each room is connected to the rooms adjacent to it. Baker burns one calorie walking from one room to an adjacent room. Because he is very lazy, Baker will always choose the path that burns the fewest calories. For example, when Baker goes from room X to room Y he will burn 5 calories.
Baker wants to know how many calories he would burn walking between every pair of rooms in a given house of size N. Can you help him out?
Input
The input consist of several input lines T (1≤T≤200), with one single integer N (1≤N≤1018), the size of the house Baker wants to know the amount of calories he might be able to burn if he walks between every pair of rooms.
Output
For each test case in the input print a line with a single number, the amount of calories Baker might burn after walking between every pair of rooms, as this number can be very big print it modulo 109+7.
題意:存在一個如上圖所示的有五個房間的房子,每個房子里有n * n個格子,求該圖中所有格子對之間的曼哈頓距離總和
一道數學題
首先將所有點對距離的總長度看作將所有點連線后該平面內所有線的總長度,而后我們將所有的格子對分為分五種情況討論
1.兩個格子均在一個房間內 記為A
2.一個格子在中央房間 一個格子在四周大方格 記為B
3.兩個格子分別在對角的房間內(綠色和紫色) 記為C
4.兩個格子分別在相鄰的房間內(綠色和黃色)的總長度 記為D
第A種情況
首先僅關注一列內方格間的總距離
單獨一列中含有n-1個長度為1的距離,n-2個長度為2的距離……以此類推,可以由等差求和和平方和公式求出單列中的距離總數。設其為X
對于這一列中 還存在其余n-1列到此列所有方格的距離,故該列中的總距離為n* X。
由于一共有n列,故總共的縱向距離為n* n* X。
橫向距離同理,故可得一個房間內的總距離為:
**A=2 *n n X
第B種情況
首先將左側房間的所有格子轉移到右側房間的第一列。
對于一個格子而言,所求為其到右側房間所有格子的總距離,故它將“發射”出n* n條線,故左側一行格子在轉移時的總距離為 n* n* [n*(n+1)/2]
整個房間n行的總距離為n* n* n* n* (n+1)/2;
然后考慮右側的房間
對于右側的每個格子,均有n* n條線段到達,對應的是左側房間的所有格子到該格子的距離,故橫向總線條數為n* n* n* n*(n-1)/2
對于縱向而言,只有第一列存在縱向的線條,由于第一列的每個點均聚集了n * n根線條,故可得縱向的線條總數為 n * n * X,由于情況A中所求出的X是不具有方向性的線條總數,在此處的線條應該具有方向性(左側第二列到右側第一列和左側第一列到右側第二列實為兩種情況),故縱向線條總數為 2 * n * n * X;
** B=[n * n * n * n* (n+1)/2]+[n* n* n* n*(n-1)/2]+[2 * n * n * X]**
第C種情況
該情況實際為B情況的延伸,只需加上通過中央房間的總距離即可
**C=B+n *n *n n n
第D種情況
對于轉角的情況,首先將左側房間的所有方格轉移到中間房間的第一列,再將其轉移到上面房間的左下角
和B情況同理,可以求得轉移過程的總距離為 n * n * n * n * (n+1)/2
最后處理上面房間的情況。
對于豎向的距離,與B情況的橫向同理,總距離為n* n* n* n*(n-1)/2
對于橫向的線條,每一列會分離出n * n * n根線條,故總距離為n* n* n* n*(n-1)/2
D= [n * n * n * n * (n+1)/2]+[n* n* n* n*(n-1)]
最后把四種情況乘上對應的數量相加就可以得到答案了。
AC代碼:
#include<iostream> using namespace std; const long long mod=1e9+7; int main(){long long n;while(cin>>n){long long x=((n-1)*n*n/2-(n-1)*n%mod*(2*n-1)/6)%mod;long long a=(2*n*n*x)%mod;long long b=((n*n%mod*n%mod*n%mod*(n+1)/2)%mod+(n*(2*x%mod*n%mod+n*n*n*(n-1)/2))%mod)%mod;long long c=(b+(n*n)%mod*(n*n)%mod*n)%mod;long long d=(((n*n)%mod*(n*n)%mod*(n+1))%mod+((n-1)*(n*n)%mod*(n*n)%mod)%mod)%mod;long long ans=((a*5)%mod+b*4%mod+c*2%mod+d*4%mod)%mod;cout<<ans<<endl;}return 0; }這道題的數據屬實有一點弱,隨便模了幾個就可以過了。
在場上一開始看錯了n的范圍,yy了一個暴力求解的辦法,結果導致后來時間緊張,在討論BCD情況的時候少乘了n* n,最后連樣例都沒過,思維和視力有待提升。(也可能是我把這道題想復雜了QWQ)
總結
以上是生活随笔為你收集整理的F. Fitness Baker的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么样使用TextPad工具,其实没那么
- 下一篇: 小米5s服务器代码_通过5S实现更易管理