description
input
第一行乙個正整數t,表示測試資料組數
對於每一組測試資料資料:
第1行:乙個正整數k
第2行:k個正整數,表示第i桶油漆可以粉刷的石柱個數,ci。
output
對於每組輸入資料,輸出一行乙個整數,表示粉刷的方案數mod 1000000007。
sample input33
1 2 3
52 2 2 2 2
101 1 2 2 3 3 4 4 5 5
sample output
1039480
85937576
data constraint
30% n≤10, t≤5
50% n≤15, t≤5
80% k≤15,ci≤5,t≤500
100% k≤15,ci≤6,t≤2000
題解題外話
話說這道題我在中考前幾天還看到過。
當時沒什麼想法,就沒有想下去。
今天一看到,突然靈機一動,發現是挺簡單的一道題。
調了好久,過了樣例,交上去,結果tle50.
為什麼呢?因為我比賽時把f陣列開成了30000*100.
然後2000每次memset一下,成功**。
考慮dp(話說暴力都不好拿分)
我們按照每一種顏料依次來弄。
那麼加入一種顏料時,只需要考慮當前顏料與已經弄完的顏料的相對位置,不需要考慮染在哪根柱子上。
意思就是,假如當前顏料是:ababbd
加入3個c種顏料一種方式是:cacbabcbd
那麼我們設f[i
]f_
f[i]
表示當前把前i 種顏料的序列做出來的方案數。
可是一維的不夠。因為題目要求是同種顏色不可以相鄰。
於是我們多加一維表示當前一共有j個位置滿足前面的顏色與當前顏色相同。
轉移就有點神奇了。
每次轉移其實就相當於把k個新顏色的球插入原序列中。
插入有方法——
每次插入有可能插入到兩個相同的球之間,也可能插入到兩個不相同的球之間。
所以,設有p個球插入到兩個相同的球之間,有q個球插入到了兩個不相同的球之間。
答案分別是:cjp
∗csu
m−j+
1q
c_j^p*c_^q
cjp∗c
sum−
j+1q
但是還可能有別的球跟在上面兩種球後面。
這就相當於在m個不相同的盒子裡放入n個相同的球的方案數。
方案數即為cn+
m−1n
c_^cn
+m−1
n(利用插板原理)
答案即為ck−
1k−p
−q
c_^ck
−1k−
p−q
標程
#include
#include
#include
#include
using
namespace std;
int maxn=
32768
,mo=
1000000007
;int n,t;
int k[16]
;long
long f[
100]
[100
],mi[16]
,c[100][
100]
,sum[
32768
],len[
32768];
long
long
qsm(
long
long a,
long
long b)
return t;
}int
main()
} mi[0]
=1;for
(int i=
1;i<=
15;i++
)scanf
("%d"
,&t)
;while
(t>0)
memset
(f,0
,sizeof
(f))
;memset
(sum,0,
sizeof
(sum));
memset
(len,0,
sizeof
(len));
f[0]
[0]=
1;for(
int i=
1;i<=n;i++
)else}}
}}sum[i]
=sum[i-1]
+k[i]
; len[i]
=len[i-1]
+1;}
}printf
("%lld\n"
,(f[n][0
])%mo);}
}
2014 9 8 noip201x模擬賽總結與展望
因為本星期學校組織考試,所以到現在才能抽出時間寫寫總結。300分滿分,得了200,q1 q3a了,q2爆了零分,下面一題題的總結吧。q1 最裸的貪心,因為心理原因還有點不敢寫,抱著爆零的心態寫了,沒想到a掉了。主要就是需要把rp從小到大排序,好像有同學就因為不排序而丟分了。很簡單,過了。q2 這道題...
JZOJ5962 NOIP2018 貨幣系統
在的國度中共有 n 種不同面額的貨幣,第 i 種貨幣的面額為 a i 你可以假設每一種貨幣都有無窮多張。為了方便,我們把貨幣種數為 n 面額陣列為 a 1 n 的貨幣系統記作 n,a 在乙個完善的貨幣系統中,每乙個非負整數的金額 x 都應該可以被表示出,即對每乙個非負整數 x,都存在 n 個非負整數...
NOIP 數學 JZOJ 3027 計算係數
給出a,b k,n m a,b,k,n,m,a,b,k,n,m,求出 ax by k ax by k ax by k,請求出多項式展開後xny mx ny m xnym 項的係數 10007 10007 10007 可以手算推幾個發現 每個係數按指數n nn遞減再遞增就可以發現是楊輝三角的某一層,然...