放棋子(chess.pas/c/cpp)
題目大意
現在有乙個 n*m 的棋盤,現在你需要在棋盤上擺放 2n 個棋子,要求滿足如下條件:
1、 每一列只能有乙個棋子;
2、 每一行的前 xi 個格仔有乙個棋子,而且最多有乙個棋子;
3、 每一行的後 yi 個格仔有乙個棋子,而且最多有乙個棋子;
求一共有多少種不同的放置方案,答案對於 1000000007 取模
輸入檔案
輸入檔案為 chess.in。
輸入共有 n+1 行。第一行有兩個整數 n,m,表示該棋盤的行數與列數。
接下來的 n 行,每行兩個整數 xi 和 yi,表示每一行的前 xi 個格仔需要有乙個棋子,每
一行的後 yi 個格仔需要有乙個棋子。
輸出檔案
輸出檔案為 chess.out。
輸出乙個整數表示共有多少種不同的方案,答案對於 1000000007 取模。
樣例輸入
3 61 2
3 33 2
樣例輸出
4資料規模與約定
n<=50 m<=200
對於所有的 i,有 xi+yi≤m。
——————————————————————————題解
首先60分我們只需要拿乘法原理算算算就可以了(把x,y排列順序不影響結果,那就變成排列後左邊對於第一行有x1中方法,第二行有x2-1種,第n行有xn-n+1種,乘法原理乘起來就好了,右邊同理,然後左右方案數相乘)因為最大的xi和最大的yi不會重合,但是如果他們最大重合了就要換乙個做法
首先我們左邊從小到大,右邊從大到小這麼想,因為xi+yi≤m,所以方塊排序後不會重疊,只是一列可能有兩種顏色
然後從左往右掃
然後我們對右邊來說事,也是從左往右掃,才能把兩者結合在一起
然後我們發現這只與i(掃到第幾行),k(選了幾個數),j(右邊可以放幾個)有關,然後我們把兩邊結合到一起
得到:不在右邊放f[i+1][j+p][k+z]+=f[i][j][k]*a(i-k,z)
在右邊放f[i+1][j-1+p][k+z+1]+=f[i][j][k]*j
最後的答案是f[m+1][0][2*n],因為到了m列的時候右邊還是可以放的
啊累死我了……本題結束了……下面是**……
1 #include 2 #include 3 #include 4 #include 5 #include 6#define mo 1000000007
7#define siji(i,x,y) for(int i=(x);i<=(y);i++)
8#define gongzi(j,x,y) for(int j=(x);j>=(y);j--)
9#define xiaosiji(i,x,y) for(int i=(x);i
10#define sigongzi(j,x,y) for(int j=(x);j>(y);j--)
11#define pii pair12
#define fi first
13#define se second
14using
namespace
std;
15int n,m,x[55],y[55],z[205],p[205],b[205],c[205
];16
int a[205][105
];17
void
anm() 23}
24}25void
init()
28 siji(i,1
,n)
33 siji(i,1,m) b[i]=b[i-1]+p[i-1];//
這是個常數優化,加上後快到飛起
34 siji(i,1,m) c[i]=c[i-1]+z[i];//
同上35 anm();//
組合數預處理36}
37int f[205][55][205];//
f(i,j,k)
38void
solve() 48}
49}50 printf("
%d\n
",f[m+1][0][2*n]);51}
52int
main()
53
2016長樂夏令營 Day4
t1 模擬。開一排const char include include include include include include include include includeusing namespace std const char n0 5 3 const char n1 5 3 con...
2016長樂夏令營 Day9
t1 帶權並查集。每個約束看做一條x連向y的邊,邊權為x y c 對於乙個x,可能有多個y與他有關係,間接可以算出y與y 的關係,那麼邊權就記為y y 每次加入條件,就看看是否衝突 細節詳見 據說正解是差分約束?苟蒻是真不會。include include includeusing namespac...
北大資訊學夏令營模擬2019 5 21 神犇
時限 2s 空限 256mb 這題非常容易想到先做個字首和 a,b,c 分別表示三個人的粉絲數 不妨變成 a b,a c,b c 這樣相當於要從前面的字首中選個三維都不一樣的,使異或和最大。那麼這個可以暴力容斥地建出八種trie 每一維選和不選 然後自高位到低位的貪心,有的話走過去即可。注意如果有兩...