CQOI2008矩陣的個數

2021-07-08 15:43:46 字數 1560 閱讀 9266

給出乙個n行3列非負整數矩陣的各行各列之和,統計有多少個矩陣滿足此條件。輸出答案模10^17的值。

第一行包含四個正整數n,c1, c2, c3,即行數與三列之和。第二行包含n個正整數,即各行三個數之和。每行每列之和均不超過125。1<=n<=200

抓住題目的資料範圍n<=200,每行每列之和均不超過125。

那麼我們便可以做dp了。

如何設狀態呢?

我們接著發現第列行的數我們是不用管的

因為若列舉了前兩個數,第三個數自然也就出來了

所以我們設: f[

i,j,

k]為做

到第i行

,第一列

和為j,

第二列和

為k的合

法方案數

那麼 f[

i+1,

j+x,

k+y]

+=f[

i,j,

k]mo

d1017

(x+y

<=a[

i+1]

,j+x

<=c1

,k+y

<=c2

) 那麼答案是不是就是f[n,c1,c2]?

不!若是合法的c1,c2,c3,a那麼便可以這樣做

但是若不合法呢?即c1

+c2+

c3<>∑n

i=1a

[i]

就要特殊判斷了

const mo=100000000000000000;

var n,c1,c2,c3,i,j,k,l,r,e:longint;

a:array[1..200] of longint;

f:array[0..200,0..130,0..130] of int64;

begin

assign(input,'1.in');reset(input);

readln(n,c1,c2,c3);

for i:=1

to n do

begin

read(a[i]);e:=e+a[i];end;

if e<>c1+c2+c3 then

begin writeln(0);exit;end;

f[0,0,0]:=1;

for i:=0

to n-1

dofor j:=0

to c1 do

for k:=0

to c2 do

for l:=0

to a[i+1] do

for r:=0

to a[i+1] do

if l+r>a[i+1] then

break

else

if (j+l<=c1)and(k+r<=c2) then

begin

f[i+1,j+l,k+r]:=(f[i,j,k]+f[i+1,j+l,k+r])mod mo;

end;

writeln(f[n,c1,c2]);

close(input);close(output);

end.

CQOI2008 矩陣的個數

description 給出乙個n行3列非負整數矩陣的各行各列之和,統計有多少個矩陣滿足此條件。輸出答案模10 17的值。input 第一行包含四個正整數n,c1,c2,c3,即行數與三列之和。第二行包含n個正整數,即各行三個數之和。每行每列之和均不超過125。output 僅乙個數,滿足條件的矩陣...

CQOI2008 矩陣的個數

反正對今天是無言。給出乙個n行3列非負整數矩陣的各行各列之和,統計有多少個矩陣滿足此條件。輸出答案模10 17的值。第一行包含四個正整數n,c1,c2,c3,即行數與三列之和。第二行包含n個正整數,即各行三個數之和。每行每列之和均不超過125。僅乙個數,滿足條件的矩陣個數模10 17的值。3 2 3...

nyoj 206 矩陣的個數

時間限制 1000 ms 記憶體限制 65535 kb 難度 1 描述 在乙個3 2的矩形中,可以找到6個1 1的矩形,4個2 1的矩形3個1 2的矩形,2個2 2的矩形,2個3 1的矩形和1個3 2的矩形,總共18個矩形。給出a,b,計算可以從中找到多少個矩形。輸入本題有多組輸入資料 10000 ...