交錯序列
題目背景:
5.3
模擬cqoi2018d1t3
分析:dp +
矩陣快速冪
第一反應看到資料範圍就覺得,可以直接
o(n) ~ o(n)
搞過去,但是很遺憾常數過大,至少我沒有卡過去,換種思路考慮化簡一下。
那麼我們只需要求得所有方案中
0的個數的
i次方之和(
0 <= i <= a + b
),那麼我們定義
f[i][j][0/1]
表示前i
位的所有合法方案的
0的個數的
j次方之和,第i位是
0/1,那麼顯然對於乙個
f[i][j][1]
直接等於
f[i - 1][j][0]
,對於f[i][j][0]
相當於把所有的方案中的
xi變成
(x + 1)i
這個可以直接二項式定理獲得對應係數,即:
利用矩陣優化即可,注意適當剪枝,複雜度
o((a + b)3 * logn)
source:
/*
created by scarlyw
*/#include #include #include #include #include #include #include #include #include #include inline char read()
return *s++;
}///*
templateinline void r(t &x)
for (x = 0; isdigit(c); c = read())
x = ((x << 2) + x << 1) + (c ^ '0');
if (iosig) x = -x;
}//*/
const int out_len = 1024 * 1024;
char obuf[out_len], *oh = obuf;
inline void write_char(char c)
templateinline void w(t x)
}inline void flush()
/*templateinline void r(t &x)
//*/
const int maxn = 180 + 10;
int n, a, b, mod;
long long fac[maxn], inv_fac[maxn];
inline long long mod_pow(long long a, long long b)
inline long long c(int n, int m)
struct matrix
matrix(int n) : n(n)
inline matrix operator * (const matrix &c) const
inline matrix operator ^ (const int x) const
} move;
inline void solve()
std::cout << (ans + mod) % mod;
}int main()
NOI模擬(5 3) CQOID1T2 社交網路
社交網路 題目背景 5.3 模擬cqoi2018d1t2 分析 矩陣樹定理 求有向圖的有根樹形圖,顯然對於有根的樹形圖是可以直接用矩陣樹定理的,那麼直接建出入度矩陣和鄰接表矩陣,入度矩陣 鄰接表矩陣獲得基爾霍夫矩陣。直接去掉 1號點所在行列直接求就可以了。複雜度 o n3 source create...
NOI模擬(5 4) CQOID2T1 解鎖螢幕
解鎖螢幕 題目背景 5.4 模擬cqoi2018d2t1 分析 狀壓dp 比較明顯是狀壓,一開始以為是子集列舉,然後看資料範圍覺得自己涼了,所以就先跳過了,最後導致沒有做這道題,然後涼涼涼,考完發現是一道簡單題 定義 f i stats 表示已經當前已經用了狀態 stats 裡的點,那麼直接列舉下乙...
清北學堂模擬賽d3t1 a
問題描述 你是能看到第一題的friends呢。hja 怎麼快速記單詞呢?也許把單詞分類再記單詞是個不錯的選擇。何大爺給出了一種分單詞的方法,何大爺認為兩個單詞是同一類的當這兩個單詞的各個字母的個數是一樣的,如dog和god。現在何大爺給了你 個單詞,問這裡總共有多少類單詞。輸入格式 第一行乙個整數n...