BZOJ4714 旋轉排列

2022-09-05 00:24:21 字數 544 閱讀 5691

對於每個$k$,問題等價於求有多少置換滿足:

1.存在乙個迴圈長度為$k$

2.任意乙個迴圈長度$\geq 2$

列舉這種環的個數$t$:

設$g_t$表示至少有$kt$個人分成$t$個長度為$k$的迴圈的方案數,考慮列舉第乙個人和哪些人分在了一起,同時有$(k-1)!$種可能的環,有$g_t=c(kt-1,k-1)g_(k-1)!$。

設$d_i$表示$i$個人錯位排列的方案數,那麼至少有$t$個長度為$k$的迴圈的方案數為$c(n,kt)g_td_$。

考慮容斥,則這部分對答案的貢獻為$(-1)^c(n,kt)g_td_$。

時間複雜度$o(n\log n)$。

#includeconst int n=500010,p=1000000007;

int n,i,j,k,t,f[n],inv[n],d[n],g[n],ans;

int main()else

} ans=1ll*ans*f[n]%p;

return printf("%d",ans),0;

}

BZOJ4714 旋轉排列

就是對於每個錯排,統計裡面有多少種環長 考慮列舉環長l,可以用容斥計算不含長為l的環的方案數cl c l,總數減去cl c l就是貢獻 cl n l i 0 nil ij 2 jl 1l 1 l 1 i c l i 0 n l i ln j 2i l 1 jl 1 l 1 i 柿子大概長這樣 預處理...

bzoj4714 旋轉排列

time limit 20 sec memory limit 512 mb submit 74 solved 46 submit status discuss 輸入僅有一行,包含乙個整數n,1 n 500000 輸出一行,包含乙個整數,代表答案。49 樣例解釋 k 2時的方案數為3,k 4時的方案數...

LintCode 搜尋旋轉排列陣列

題目 假設有乙個排序的按未知的旋轉軸旋轉的陣列 比如,0 1 2 4 5 6 7 可能成為4 5 6 7 0 1 2 給定乙個目標值進行搜尋,如果在陣列中找到目標值返回陣列中的索引位置,否則返回 1。你可以假設陣列中不存在重複的元素。樣例 給出 4,5,1,2,3 和target 1,返回 2 給出...