日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

牛客练习赛 62

發(fā)布時(shí)間:2023/12/3 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客练习赛 62 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

A.牛妹的游戲

Ramsey定理:人話解釋任意六個(gè)人中要么至少三個(gè)人認(rèn)識(shí),要么至少三個(gè)不認(rèn)識(shí)。

結(jié)論簡(jiǎn)要證明:

假設(shè) 666 個(gè)據(jù)點(diǎn)分別為 A,B,C,D,E,FA,B,C,D,E,FA,B,C,D,E,F那么在 A 連向其它據(jù)點(diǎn)的控制鏈中,必然至少有 333條鏈被同一方控制,不妨假設(shè)它們?yōu)?AB,AC,ADAB,AC,ADAB,AC,AD。如此一來(lái)只要 BC,BD,CDBC,BD,CDBC,BD,CD 中有任意一條鏈也被這一方控制,則可以形成控制區(qū)域;如果這三條鏈都沒(méi)有被這一方控制,也就意味著它們都被對(duì)方控制了,則它們同樣可以形成控制區(qū)域。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef pair<int,int> pii; typedef long long ll; const int N=500010; int n,m; int e[10][10]; int main() {IO;int T=1;cin>>T;while(T--){cin>>n>>m;memset(e,0,sizeof e);if(n>5){for(int i=1;i<=m;i++){int a,b;cin>>a>>b;}cout<<"yes\n";continue;}for(int i=1;i<=m;i++){int a,b;cin>>a>>b;e[a][b]=e[b][a]=1;}bool ok=0;for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)for(int k=j+1;k<=n;k++)if(e[i][j]&&e[j][k]&&e[k][i]||!e[i][j]&&!e[j][k]&&!e[k][i])ok=1;if(ok) cout<<"yes\n";else cout<<"no\n";}return 0; }

B.病毒擴(kuò)散

打表找規(guī)律,楊輝三角。
第四秒后擴(kuò)張現(xiàn)象如下圖

[1×14×16×14×11×14×16×24×31×46×14×31×64×11×41×1]\begin{bmatrix} 1×1&4×1&6×1&4×1&1×1\\4×1&6×2&4×3&1×4\\6×1&4×3&1×6\\4×1&1×4\\1×1 \end{bmatrix}???????1×14×16×14×11×1?4×16×24×31×4?6×14×31×6?4×11×41×1???????
好像不是那么明顯,我們把乘號(hào)左邊和右邊的數(shù)分別拿出來(lái)
左邊:[146414641641411]左邊:\begin{bmatrix} 1&4&6&4&1\\4&6&4&1\\6&4&1\\4&1\\1 \end{bmatrix}:???????14641?4641?641?411???????

右邊:[111111234136141]右邊:\begin{bmatrix} 1&1&1&1&1\\1&2&3&4\\1&3&6\\1&4\\1 \end{bmatrix}:???????11111?1234?136?141???????
不難發(fā)現(xiàn)這兩個(gè)矩陣的這些數(shù)和組合數(shù)(楊輝三角)有關(guān)
考慮位置為(x,y)(x,y)(x,y)時(shí)間是ttt的情況下:
左邊的數(shù)Ctx+yC_{t}^{x+y}Ctx+y?,右邊的數(shù)Cx+yxC_{x+y}^xCx+yx?那么最終答案就是Ctx+y×Cx+yxC_{t}^{x+y}×C_{x+y}^xCtx+y?×Cx+yx?
預(yù)處理階乘和逆元即可O(1)O(1)O(1)得到每個(gè)位置的答案
我看不懂的官方證明轉(zhuǎn)化

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; typedef pair<int,int> pii; typedef long long ll; const int N=5010; const ll mod=998244353; ll fact[N],infact[N]; ll qmi(ll a,ll b,ll p) {ll res=1;while(b){if(b&1) res=res*a%p;b>>=1;a=a*a%p;}return res; } void init() {fact[0]=infact[0]=1;for(int i=1;i<N;i++){fact[i]=fact[i-1]*i%mod;infact[i]=qmi(fact[i],mod-2,mod);} } int n; int main() {IO;int T=1;//cin>>T;init();while(T--){cin>>n;while(n--){int x,y,t;cin>>x>>y>>t;if(x+y>t) cout<<0<<'\n';else{ll res=1;res=res*fact[t]*infact[x+y]%mod*infact[t-x-y]%mod;res=res*fact[x+y]%mod*infact[x]%mod*infact[y]%mod;cout<<res<<'\n';}}}return 0; }

C.牛牛染顏色

樹(shù)形dp
狀態(tài)表示:f(i,0/1)f_{(i,0/1)}f(i,0/1)?表示選擇/不選擇uuu 這個(gè)節(jié)點(diǎn)后以 uuu 為根的子樹(shù)的合法方案數(shù)。
狀態(tài)轉(zhuǎn)移:
若選擇 uuu 這個(gè)節(jié)點(diǎn),則子樹(shù)內(nèi)可以隨便選點(diǎn),每個(gè)子樹(shù)獨(dú)立乘法原理可得轉(zhuǎn)移f(i,1)=∏j∈sonf(j,0)+f(j,1)f_{(i,1)}=\prod_{j\in son} f_{(j,0)}+f_{(j,1)}f(i,1)?=json?f(j,0)?+f(j,1)?
若不選擇uuu 這個(gè)節(jié)點(diǎn),則最多選擇某一個(gè)子樹(shù),由加法原理可得轉(zhuǎn)移f(i,0)=1+∑j∈son(f(j,0)+f(j,1)?1)f_{(i,0)}=1+\sum_{j\in son}(f_{(j,0)}+f_{(j,1)}-1)f(i,0)?=1+json?(f(j,0)?+f(j,1)??1)(? f(i,0)f_{(i,0)}f(i,0)?包含空集的方案,所以在枚舉子樹(shù)統(tǒng)計(jì)的時(shí)候每顆子樹(shù)貢獻(xiàn)的答案要減 111,但最后也要把空集的情況算上,還要加個(gè)111

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int N=1000010,mod=1e9+7; int h[N],e[2*N],ne[2*N],idx; ll f[N][2]; int n; void add(int a,int b) {e[idx]=b;ne[idx]=h[a];h[a]=idx++; } void dfs(int u,int fa) {f[u][0]=f[u][1]=1;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa) continue;dfs(j,u);f[u][1]=(f[u][1]*(f[j][0]+f[j][1]))%mod;f[u][0]=(f[u][0]+f[j][1]+f[j][0]-1)%mod;} } int main() {IO;int T=1;//cin>>T;while(T--){cin>>n;memset(h,-1,sizeof h);for(int i=1;i<n;i++){int a,b;cin>>a>>b;add(a,b),add(b,a);}dfs(1,-1);cout<<(f[1][0]+f[1][1])%mod<<'\n';}return 0; }

D. 牛牛的呱數(shù)

對(duì)于大數(shù),基本上都是取模達(dá)到我們想要的目的。
由此可以把原串取模后的答案記錄下來(lái),并且記錄它的長(zhǎng)度(邊權(quán)),和別的串相接的過(guò)程就類似從一個(gè)狀態(tài)到另一個(gè)狀態(tài),只需要預(yù)處理10k%p10^k\%p10k%p的結(jié)果跑最短路即可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef pair<int,int> pii; const int N=210; int ten[1000010]; struct node {int val,len; }a[N]; int dist[N],n,p; bool st[N]; void dijkstra() {memset(dist,0x3f,sizeof dist);priority_queue<pii,vector<pii>,greater<pii> >q;for(int i=1;i<=n;i++) {dist[a[i].val]=min(dist[a[i].val],a[i].len);q.push({a[i].len,a[i].val});}while(q.size()){int t=q.top().second;q.pop();if(st[t]) continue;st[t]=1;for(int i=1;i<=n;i++){int now=(t*ten[a[i].len]%p+a[i].val)%p;if(dist[now]>dist[t]+a[i].len){dist[now]=dist[t]+a[i].len;q.push({dist[now],now});}}} } int main() {IO;int T=1;//cin>>T;while(T--){cin>>n>>p;ten[0]=1;for(int i=1;i<=1000000;i++) ten[i]=ten[i-1]*10%p;for(int i=1;i<=n;i++){string s;cin>>s;a[i].len=s.size();reverse(s.begin(),s.end());ll base=1;ll now=0;for(auto t:s){now=(now+base*(t-'0')%p)%p;base=base*10%p;}a[i].val=now%p;}dijkstra();if(dist[0]==0x3f3f3f3f) cout<<"-1\n";else cout<<dist[0]<<'\n';}return 0; }

要加油哦~~

總結(jié)

以上是生活随笔為你收集整理的牛客练习赛 62的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。