2017.03.18【NOIP 普及組】模擬賽C組 單元格 題解

原題:

http://172.16.0.132/junior/#contest/show/1376/2

題目描述:

在一個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。所謂的兩種不同方案是指:只要它們選中的單元格有一個不同,就認爲是不同的方案。

輸入:

一行,4個整數,R、C、minT、maxT。3≤R,C≤4000, 1≤minT≤maxT≤20000。
對於30%的數據, 3 ≤ R, C ≤ 70。

輸出:

一個整數,表示不同的選擇方案數量模1000000007後的結果。

輸入樣例:

輸入樣例1:
3 3 1 20000

輸入樣例2:
3 3 4 7

輸入樣例3:
4 6 9 12

輸入樣例4:
7 5 13 18

輸入樣例5:
4000 4000 4000 14000

輸出樣例:

輸出樣例1:
6

輸出樣例2:
0

輸出樣例3:
264

輸出樣例4:
1212

輸出樣例5:
859690013

分析:

我們設a,b,c三個點成一矩形,就變成醬紫:
這裏寫圖片描述
這裏寫圖片描述
三點佔據四邊。則費用是邊長。有四種方法。
最後推出公式:ans:=(ans+(i-2)(j-2)(r-i+1)*(c-j+1)*6);(個數)

實現:

#include<cstdio>

long long ans,r,c,mint,maxt,i,j;
int main()
{
    freopen("table.in","r",stdin);freopen("table.out","w",stdout);
    scanf("%lld%lld%lld%lld",&r,&c,&mint,&maxt);
    for(i=3;i<=r;i++)
        for(j=3;j<=c;j++)
            if((i+j-2)*2>=mint&&(i+j-2)*2<=maxt) 
            {
                ans=(ans+(i-2)*(j-2)*6*(r-i+1)*(c-j+1))%1000000007;
            }
    printf("%lld\n",ans);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章