牛客练习赛 64——错排
A.怪盜-1412
111…1??n2?444…4?m111…1??n2?222…2?k\begin{matrix} \underbrace{ 111\dots\ 1} \\ \lfloor \frac{n}{2} \rfloor \end {matrix}\begin{matrix} \underbrace{ 444\dots\ 4} \\ m \end{matrix}\begin{matrix} \underbrace{ 111\dots\ 1} \\ \lceil \frac{n}{2} \rceil \end {matrix}\begin{matrix} \underbrace{ 222\dots\ 2} \\ k \end {matrix}111…?1??2n???444…?4?m?111…?1??2n???222…?2?k?
上述排列方式最優,由此根據組合數即可求解。
Dis2
與某個點距離為2的點有三種①父親的父親②兒子的兒子③兄弟節點
跑dfs統計以下即可
sz[u]表示u節點兒子的數量
C.序列卷積之和
一步一步推式子,預處理各種前綴和。真的無腦暴力
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=200010: const ll mod=1e9+7; ll a[N],b[N],c[N],d[N],e[N],f[N]; int n; int main() {IO;int T=1;//cin>>T;while(T--){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++) b[i]=(b[i-1]+a[i])%mod;for(int i=1;i<=n;i++) c[i]=(c[i-1]+a[i]*b[i-1]%mod)%mod;for(int i=1;i<=n;i++) d[i]=(d[i-1]+b[i]*b[i]%mod)%mod;for(int i=1;i<=n;i++) e[i]=(e[i-1]+b[i])%mod;for(int i=1;i<=n;i++) f[i]=(f[i-1]+c[i])%mod;ll res=0;for(int i=1;i<=n;i++) res=(res+d[n]-d[i-1]-b[i-1]*(e[n]-e[i-1])%mod-f[n]+f[i-1]+(n-i+1)*c[i-1]%mod)%mod;cout<<(res+mod)%mod<<'\n';}return 0; }D.寶石裝箱
學習自大佬題解
首先先說一下錯排,雖然我沒做過錯排,看到這個題首先想到如果每個箱子只對應一個不能放的寶石,那么直接可以容斥原理解決了,不過此題沒有那么簡單。看了上述文章學到錯排還可以用遞推方式解決這里記錄一下。
狀態表示:fif_ifi?錯排規模為iii時的方案數
狀態計算:對于規模為iii的錯排,考慮第iii個小球,不妨讓第iii個小球放在了第j(1≤j<i)j(1\leq j<i)j(1≤j<i)個箱子里(第iii禁止放在第iii個箱子里),那么考慮第kkk個小球是否放在了第iii個箱子,如果放在了第iii個箱子那么很容易發現現在規模是i?2i-2i?2的錯排方案,如果沒有放在第iii個箱子里那么現在規模是i?1i-1i?1的錯排方案,又因為kkk有i?1i-1i?1種選擇那么可以得到遞推式fi=(i?1)×(fi?1+fi?2)f_i=(i-1)×(f_{i-1}+f_{i-2})fi?=(i?1)×(fi?1?+fi?2?)
經過一頓操作計算可得fn=n![12!?13!+?+(?1)n1n!]f_n=n![\frac{1}{2!}-\frac{1}{3!}+\dots+(-1)^n\frac{1}{n!}]fn?=n![2!1??3!1?+?+(?1)nn!1?]
不難看出上式和容斥原理得出的答案相同。
容斥原理后現在需要求得至少{1,2,3,…,n}\{1,2,3,\dots,n\}{1,2,3,…,n}個盒子不合法的情況,直接上上述大佬題解結論:
狀態表示:f(i,j)f_{(i,j)}f(i,j)?對于只考慮前iii種盒子,jjj個盒子不合法的方案數
狀態轉移:考慮最后一步第iii個盒子是否合法易得出f(i,j)=f(i?1,j)+f(i?1,j?1)×cntif_{(i,j)}=f_{(i-1,j)}+f_{(i-1,j-1)}×cnt_if(i,j)?=f(i?1,j)?+f(i?1,j?1)?×cnti?cnticnt_icnti?是第iii個箱子不能放的小球數量
這個dp太妙了吧,遞推太精髓了。
E.紅色的櫻花
待補——2020/9/23補
大佬題解
擴展歐幾里得可以求出正整數a,ba,ba,b滿足ax+by=gcd(a,b)ax+by=gcd(a,b)ax+by=gcd(a,b)一組特解{x=x0y=y0\begin{cases} x=x_0 \\y=y_0\end{cases}{x=x0?y=y0??,通解是{x=x0+kbgcd(a,b)y=y0?kagcd(a,b)\begin{cases} x=x_0+\frac{kb}{gcd(a,b)} \\y=y_0-\frac{ka}{gcd(a,b)}\end{cases}{x=x0?+gcd(a,b)kb?y=y0??gcd(a,b)ka??
本人在看上述題解的時候不明白如何判斷兩點是否在同一個循環中于時自己推了一下:{sx+?=k1n+exsy+?=k2m+ey\begin{cases} s_x+?=k_1n+e_x \\s_y+?=k_2m+e_y\end{cases}{sx?+?=k1?n+ex?sy?+?=k2?m+ey??兩式子作差可得sx?sy?(ex?ey)=k1n+(?k2)m=kgcd(n,m)s_x-s_y-(e_x-e_y)=k_1n+(-k_2)m=kgcd(n,m)sx??sy??(ex??ey?)=k1?n+(?k2?)m=kgcd(n,m)
由此推出sx?sy?(ex?ey)≡0(gcd(n,m))s_x-s_y-(e_x-e_y)\equiv0 (gcd(n,m))sx??sy??(ex??ey?)≡0(gcd(n,m))
因此只要滿足上述式子,就能保證兩點在同一循環中。
那么如何通過操作二使得不在同一個循環的兩點處在同一循環?
{sx+xd=k1n+exsy=k2m+ey\begin{cases} s_x+xd=k_1n+e_x \\s_y=k_2m+e_y\end{cases}{sx?+xd=k1?n+ex?sy?=k2?m+ey??兩式子作差可得sx?sy?(ex?ey)+xd=k1n+(?k2)m=ygcd(n,m)s_x-s_y-(e_x-e_y)+xd=k_1n+(-k_2)m=ygcd(n,m)sx??sy??(ex??ey?)+xd=k1?n+(?k2?)m=ygcd(n,m)進一步化簡可得
xd+ygcd(n,m)=ex?ey?(sx?sy)xd+ygcd(n,m)=e_x-e_y-(s_x-s_y)xd+ygcd(n,m)=ex??ey??(sx??sy?)由此用擴展歐幾里得求出最小正整數xxx即可。
要加油哦~
總結
以上是生活随笔為你收集整理的牛客练习赛 64——错排的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 欧冠和欧洲杯分别是什么比赛
- 下一篇: 王宝强演的电影 王宝强简介