就是對於每個錯排,統計裡面有多少種環長
考慮列舉環長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
)(柿子大概長這樣)
預處理一些東西後就可以o(
nlog
n)o (n
logn
)算了
code:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using namespace std;
const int maxn = 510000;
const int mod = 1e9+7;
inline void add(int &a,const int &b)
int pw(int
x,int k)
int inv(int
x)int
s[maxn],invs[maxn];
int c(int i,int j)
int g[maxn];
int n;
void pre()
for(int i=0;i<=n;i++) g[i]=(ll)g[i]*s[i]%mod;
}int main()
cc=(g[n]-cc+mod)%mod;
add(ans,cc);
}printf("%d\n",ans);
return
0;}
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時的方案數...
BZOJ4714 旋轉排列
對於每個 k 問題等價於求有多少置換滿足 1.存在乙個迴圈長度為 k 2.任意乙個迴圈長度 geq 2 列舉這種環的個數 t 設 g t 表示至少有 kt 個人分成 t 個長度為 k 的迴圈的方案數,考慮列舉第乙個人和哪些人分在了一起,同時有 k 1 種可能的環,有 g t c kt 1,k 1 g...
LintCode 搜尋旋轉排列陣列
題目 假設有乙個排序的按未知的旋轉軸旋轉的陣列 比如,0 1 2 4 5 6 7 可能成為4 5 6 7 0 1 2 給定乙個目標值進行搜尋,如果在陣列中找到目標值返回陣列中的索引位置,否則返回 1。你可以假設陣列中不存在重複的元素。樣例 給出 4,5,1,2,3 和target 1,返回 2 給出...