不會生成函式 /yun
弱化版直接二項式反演亂搞做差卷積就好了。
考慮 \(f[i]\) 為至少 \(i\) 對情侶坐一起的方案數,顯然 \(f[i]=\binom\binomi!2^i*(2n-2i)!\),即欽定 \(i\) 對情侶,\(i\) 排座位,情侶座位選擇可以全排列,每對情侶可以選擇是否交換座位,剩下的隨便坐。
\(g[i]\) 為恰好 \(i\) 對情侶坐一起。
\[f[i]=\sum_^n\binomg[j]
\]\[g[j]=\sum_^n(-1)^\binomf[j]
\]套路化一下發現可以 ntt 優化。
強化版考慮正難則反,能不能搞出 \(i\) 對情侶錯排情況數?能的話就好做了。只要欽定 \(k\) 對情侶坐一起,剩下的錯排開就好了。
設 \(g[i]\) 為只有 \(i\) 對情侶且每對情侶都錯排開的情況數。\(g[0]=1,g[1]=0\)。
\[g[i]=2i(2i-2)(g[i-1]+2(i-1)g[i-2])
\]因為是遞推,所以可以不考慮各排的排列,因為每次新加入的人的不同已經等價於了。
或者說,你可以認為每次進來的人都去第一排,那麼每次進來的人可能不一樣,所以各排間的全排列不需要。
隨便選 2 個不是情侶的人,然後要不要選他們的情侶,那我們當前問題的規模就減小 1。假如選他們的情侶,那麼規模減小 2,再選他們的情侶所在的排。
事實上這種組合意義這麼 nb 的我在考場上也應該想不到,倒是弱化版挺一眼的。
#include #define int long long
#define pb push_back
using namespace std;
int rd()
while(isdigit(ch))
return sum*f;
}#define n 2005
#define m (int)(4e5+5)
const int mod=998244353,g=3;
int fpow(int x,int y)
return res;
}const int invg=fpow(g,mod-2);
void ntt(int *f,int n,bool fl=1)
void solve()
while(isdigit(ch))
return sum*f;
}#define n (int)(5e6+5)
const int mod=998244353;
int g[n],jie[n],djie[n];
int fpow(int x,int y)
return res;
}int c(int n,int m)
void solve()
TJOI2018 數學計算
如果採取暴力的做法,那麼乘起來會炸longlong,除非寫個高精。再考慮乘一下逆元呢,顯然也不行,模數不一定為質數。這道題的關鍵點在於這句話,對於每乙個型別1的操作至多會被除一次 這句話的最基本的告訴了我們每次得到的答案一定是乙個整數 其次,這句話保證了可以應用線段樹解決這個問題 如果除的操作可能會...
Tjoi2018 數學計算
bzoj luogu 線段樹分治 是不是想問為什麼不暴力做?模數沒說是質數,所以不一定有逆元.然後就是要每次build一下把線段樹權值init成1,博豬不知道為什麼for就wa,build就過了 用re自動機查了下,發現還是有0.for int i 1 i 1 i s i 1 define ls x...
2018數學建模國賽記錄
本來是在答辯之後就想寫的,無奈中途太多事情抽不開身,再加上期末複習的時間,結果就拖到了現在。這次國賽其實還是對我幫助很大的,從暑假培訓開始,到整個答辯過程結束,中間經歷了很多事情。首先是暑期培訓,由於我是從大二才開始進行數學建模,所以對於這方面的各種常用演算法和其他的模型都不太了解。暑期培訓的這乙個...