沒錯,全世界都\(\mathrm{AK}\)了。算法
這題不難。直接嚴格分一下類,看看\(k\)我的、\(k+1\)我的、\(k+2\)我的都錯開的方案數便可。spa
很裸的容斥原理題啊。get
惟一的坑點就是在處理\(\mathrm{lcm}\)的時候,若是\(\mathrm{lcm}\)已經超過了上界\(\mathrm{R}\),就應該直接退出,否則會溢出。ast
\(\mathrm{T3}\)class
十 年 O I 一 場 空 , 不 看 題 意 見 祖 宗 。原理
看清題意以後其實也不難啊。二進制
對於每組數據,預處理出\(\mathrm{f[i][j]}\)表示在\(i\)個數位中湊出和爲\(j\)的數字的方案數,時間複雜度是\(\Theta (n^2k^2)\)的,毫無壓力、
而後回到題意,先算出 前\(n\)個數字的總和等於最後\(n\)個數字的總和的方案數 和 下標是奇數的全部數字的總和等於下標是偶數的全部數字的總和 的方案數的和,再減去同時知足這兩種規則的方案數便可。
連題都不看清楚,果真能夠退役。
這題刷新了我程序的細節方面的上限了……
不過自己的算法並不難,就是直接枚舉\(k\)個字符串「壓」在一塊兒,而後「壓」好的字符串(假設這個字符串存在)有多少種多是能夠直接算出來的。
但題目要求了構造出的字符串只能匹配\(k\)個字符串,因此咱們還要再看看構造出的這些可能的字符串中有哪些是和剩下\(n-k\)個字符串是可以匹配的,可是由於一個構造出的字符串可能和多個字符串匹配,因此咱們還要再容斥一下。
因此就是 \(01\)二進制枚舉(也能夠用\(\mathrm{DFS}\)實現)+容斥原理,雖然細節巨多,但總比扮演方案這種題目要簡單。
被思惟定式帶到了容斥原理了,結果比賽完一想才發覺簡單得要死……
用\(\mathrm{f[i][j]}\)表示 當前放了數字的位置的二進制狀態爲\(i\),且最後一個放進去的數爲\(a[j]\)的方案數。而後就直接枚舉\(a[j]\)可以放進\(i\)中的哪一位便可。
可是最終的答案不是\(\mathrm{f[(1<<n)-1][n]}\),由於整個數組中確定會有重複的元素,這個時候就要像求可重集排列同樣把這些多餘元素的全排列的積除掉。