加強前這道題還是比較友好的
首先我們設\(g_x\)為x對情侶沒有一對坐在一起的數量
然後答案就可以表示成:\(c_n^k*a_n^k*2^k*g_\)
這裡的複雜度是\(o(t*n)\),貌似不錯,所以現在問題變成求\(p_x\)了
第一篇題解是利用這是乙個錯牌問題,用遞推式解決,複雜度為優秀的\(o(n)\),但是由於詢問的複雜度已經是\(o(t*n)\)了,假設我們並不知道這個遞推式,我們還能怎麼做呢?
考慮暴力容斥:
所有的情況是\((2*x)!\),然後一對以上情侶數量為\(c_x^1*(2*x-2)!*2*a_x^1\),意義是:我可以在x對中選取一對,其他的\(x-1\)對是隨便做的,然後這對情侶可以交換位置,並且占領\(a_x^1\)排位置
然後兩對以上,三對以上也是差不多的,求出來以後直接容斥就好了,所以整體的柿子長成這樣:
\[g_x=\sum_^x2*(-1)^i*c_x^i*(2*x-2*i)
\]這個式子暴力去算就好了,複雜度\(o(n^2)\),所以整體複雜度還是\(o(n^2)\)(注意在具體**中我把組合數拆開了)
#includeusing namespace std;
#define il inline
#define re register
#define mod 998244353
il int read()
while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
return x * f;
}#define rep(i, s, t) for(re int i = s; i <= t; ++ i)
#define maxn 1005
int pai[maxn << 1], inv[maxn << 1], g[maxn];
il int mul(int a, int b)
il int qpow(int a, int b)
return r;
}il int c(int n, int m)
il int a(int n, int m)
il void solve(int x)
il int get(int x)
return (ans + mod) % mod;
}int main()
luoguP4921 情侶?給我燒了!
考慮對於 n 對情侶,恰好 k 對是和諧的方案數是 ans n k binoma k n2 kg n k g n 為全部 n 對情侶不和諧的方案數 容易知道去掉所有合法的就是不合法的 g n 2n sum ans n i 這樣我們就可以在 o n 2 的時間內預處理出所有答案 include inc...
luogu P4931 情侶?給我燒了!
雙倍經驗 傳送門首先坐在一起的cp和不坐在一起的cp是相對獨立的,可以分開考慮,然後方案數相乘 坐在一起的cp,方案為 binom binom k 2 k 首先選出k排座位,然後選出k對cp坐下,然後這k對可以任意打亂順序,並且每一對可以換座位 不坐在一起的cp,一開始以為就是個錯排,然後錯排其實是...
數學 MtOI2018 情侶?給我燒了!
不會生成函式 yun 弱化版直接二項式反演亂搞做差卷積就好了。考慮 f i 為至少 i 對情侶坐一起的方案數,顯然 f i binom binomi 2 i 2n 2i 即欽定 i 對情侶,i 排座位,情侶座位選擇可以全排列,每對情侶可以選擇是否交換座位,剩下的隨便坐。g i 為恰好 i 對情侶坐一...