在乙個r行c列的**裡,我們要選出3個不同的單元格。但要滿足如下的兩個條件:(1)選中的任意兩個單元格都不在同一行。
(2)選中的任意兩個單元格都不在同一列。
假設我們選中的單元格分別是:a,b,c,那麼我們定義這種選擇的「費用」= f[a][b] + f[b][c] + f[c][a]。 其中f[a][b]是指單元格a到單元格b的距離,即兩個單元格所在行編號的差的絕對值 + 兩個單元格所在列編號的差的絕對值。例如:單元格a在第3行第2列,單元格b在第5行第1列,那麼f[a][b] =|3-5|+|2-1| = 2 + 1 = 3。至於f[b][c], f[c][a]的意義也是同樣的道理。現在你的任務是:有多少種不同的選擇方案,使得「費用」不小於給定的數mint,而且不大於給定的數maxt,即「費用」在【mint, maxt】範圍內有多少種不同的選擇方案。答案模1000000007。所謂的兩種不同方案是指:只要它們選中的單元格有乙個不同,就認為是不同的方案。
輸入樣例3 3 1 200003 3 4 7
4 6 9 12
7 5 13 18
4000 4000 4000 14000
輸出樣例
首先可以先開乙個腦洞,想像乙個大正方形被切割很多個矩形。such as(s),乙個4x4的正方形可以分割成16個1x1的小正方形,12個1x2的小長方形......
然後再仔細觀察上圖,發現其實這三個點之間的距離相加就是這個矩形的周長-4,。
那麼我們就可以列舉這個矩形的長和寬了,然後在算這個小矩形在我們大矩形(r,c)中出現的次數就可以了。那麼這個矩形在大矩形的出現的次數即為(r - r + 1)(c - c + 1)。r和c為我們列舉的小矩形。接著,我們需要判定這個矩形的周長-4是否滿足:mint <= 2(i + j) - 4 <= maxt。
兩種情況:
1.三點都在邊上,有一點在頂點
2.三點都在邊上,有兩點在頂點
(這也是為什麼要想像我們有很多小矩形的原因,我們要盡量計算點在邊上或頂點的情況)
1情況:有(i−2)(j−2)可能 // -2是因為頂點不算
2.情況:有(i−2)(j−2)可能 // -2是因為頂點不算
然後我們可以發現,這種情況是可以有變化的,某個在頂點上的點如果位置變化那麼情況又會隨之變化。
那麼經過交換頂點後:
1情況:有4* (i−2)(j−2)種可能
2情況:有2* (i−2)(j−2)種可能
共有6 * 2(i−2)(j−2)種可能。
在綜合就有:6 * 2(i-2)(j-2) * (r - r + 1) *(c-c+1)
#include#include#includeusing namespace std;
long long n,m,mint,maxt,ans = 0;
int main()
printf("%lld",ans);
return 0;
}
jzoj P1509 普及模擬 單元格
題目大意 在乙個r行c列的 要選出3個不同的單元格a,b,c。定義這種選擇的 費用 f a b f b c f c a f x y 是指x到y的距離,即x,y所在行編號的差的絕對值 x,y所在列編號的差的絕對值。求出在min max費用範圍內有多少個這種選擇。題解 ans 6 r 2 c 2 r i...
數學 (JZOJ) 普及模擬 單元格
題目描述 在乙個r行c列的 裡,我們要選出3個不同的單元格。但要滿足如下的兩個條件 1 選中的任意兩個單元格都不在同一行。2 選中的任意兩個單元格都不在同一列。假設我們選中的單元格分別是 a,b,c,那麼我們定義這種選擇的 費用 f a b f b c f c a 其中f a b 是指單元格a到單元...
JZOJ 3 18 1509 普及模擬 單元格
題目描述 在乙個r行c列的 裡,我們要選出3個不同的單元格。但要滿足如下的兩個條件 1 選中的任意兩個單元格都不在同一行。2 選中的任意兩個單元格都不在同一列。假設我們選中的單元格分別是 a,b,c,那麼我們定義這種選擇的 費用 f a b f b c f c a 其中f a b 是指單元格a到單元...