數學 MtOI2018 情侶?給我燒了!

2022-09-20 12:36:14 字數 1390 閱讀 1313

不會生成函式 /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數學建模國賽記錄

本來是在答辯之後就想寫的,無奈中途太多事情抽不開身,再加上期末複習的時間,結果就拖到了現在。這次國賽其實還是對我幫助很大的,從暑假培訓開始,到整個答辯過程結束,中間經歷了很多事情。首先是暑期培訓,由於我是從大二才開始進行數學建模,所以對於這方面的各種常用演算法和其他的模型都不太了解。暑期培訓的這乙個...