<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【比賽記錄】2025CSP-S模擬賽59

      A B C D Sum Rank
      - - 11 0 11 21/25

      A. 一個贏家

      顯然總方案數為 \(\frac{(2n)!}{2^n}\),考慮求出合法方案數。

      又顯然最大值 \(i\in[2n+1,4n-1]\)。又又顯然 \(i\) 的組成方式為 \(x=\lceil\frac{4n-i}{2}\rceil\)。考慮欽定一個組成 \(a+b(a>b)\),于是對于另一種組合 \(a'+b'\),要求實際給出的組合 \(a'+c\) 滿足 \(c<b'\)。從大到小考慮每個 \(a'\),發現每個 \(c\) 的取值都為 \(i-2n-1\)。于是最大值為 \(i\) 的方案數即為:

      \[\frac{nx{n-1\choose x-1}(x-1)!(i-2n-1)^{x-1}[2(n-x)]!}{2^{n-x}} \]

      時間復雜度 \(O(n\log n)\)。輕微卡常,卡卡即可。

      Code
      #include<bits/stdc++.h>
      #define ll long long
      #define il inline
      using namespace std;
      namespace asbt{
      const int maxn=1e7+5,mod=1e9+7;
      il int qpow(int x,int y=mod-2){
      	int res=1;
      	while(y){
      		if(y&1){
      			res=res*1ll*x%mod;
      		}
      		x=x*1ll*x%mod,y>>=1;
      	}
      	return res;
      }
      int n,fac[maxn],inv[maxn],_2[maxn];
      int main(){
      	ios::sync_with_stdio(0),cin.tie(0);
      	cin>>n;
      	if(n==1){
      		cout<<1;
      		return 0;
      	}
      	fac[0]=1;
      	for(int i=1;i<=n<<1;i++){
      		fac[i]=fac[i-1]*1ll*i%mod;
      	}
      	inv[n<<1]=qpow(fac[n<<1]);
      	for(int i=n<<1;i;i--){
      		inv[i-1]=inv[i]*1ll*i%mod;
      	}
      	_2[0]=1;
      	for(int i=1;i<=n;i++){
      		_2[i]=_2[i-1]*500000004ll%mod;
      	}
      	int ans=0;
      	for(int i=2*n+1;i<n<<2;i++){
      		int x=(4*n-i+1)>>1;
      		ans=(x*1ll*n%mod*fac[n-1]%mod*inv[n-x]%mod*qpow(i-2*n-1,x-1)%mod*fac[(n-x)<<1]%mod*_2[n-x]+ans)%mod;
      	}
      	cout<<ans*1ll*qpow(2,n)%mod*inv[n<<1]%mod;
      	return 0;
      }
      }
      int main(){return asbt::main();}
      

      B. 磁鐵

      考慮對于磁鐵的一個排列 \(p\),求出使磁鐵順次擺放能占據的最小的空間 \(f(p)\),于是會對答案造成 \({l-f(p)+n\choose n}\) 的貢獻。考慮求出 \(g(x)\) 表示 \(f(p)=x\)\(p\) 的數量。

      發現對于兩個磁鐵 \(r_i\)\(r_j\),影響距離的是 \(\max(r_i,r_j)\),于是將 \(r\) 排序后進行連續段 DP。設 \(dp_{i,j,k}\) 表示前 \(i\) 個磁鐵形成了 \(j\) 段,占據的總空間為 \(k\) 的方案數,于是又轉移:

      \[dp_{i,j,k}\times(j+1)\to dp_{i+1,j+1,k+1}\\ dp_{i,j,k}\times2\times j\to dp_{i+1,j,k+r_{i+1}}\\ dp_{i,j,k}\times(j-1)\to dp_{i+1,j-1,k+2r_{i+1}-1} \]

      于是 \(g(x)=dp_{n,1,x}\)。時間復雜度 \(O(n^2l)\)

      Code
      #include<bits/stdc++.h>
      #define ll long long
      #define il inline
      using namespace std;
      namespace asbt{
      const int maxn=3e4+5,mod=1e9+7;
      int n,m,a[55],fac[maxn],inv[maxn];
      int f[55][55][maxn];
      il int qpow(int x,int y=mod-2){
      	int res=1;
      	while(y){
      		if(y&1){
      			res=res*1ll*x%mod;
      		}
      		x=x*1ll*x%mod,y>>=1;
      	}
      	return res;
      }
      il void init(){
      	fac[0]=1;
      	for(int i=1;i<=m;i++){
      		fac[i]=fac[i-1]*1ll*i%mod;
      	}
      	inv[m]=qpow(fac[m]);
      	for(int i=m;i;i--){
      		inv[i-1]=inv[i]*1ll*i%mod;
      	}
      }
      il int C(int x,int y){
      	if(x<y||y<0){
      		return 0;
      	}
      	return fac[x]*1ll*inv[y]%mod*inv[x-y]%mod;
      }
      int main(){
      	ios::sync_with_stdio(0),cin.tie(0);
      	cin>>n>>m;
      	for(int i=1;i<=n;i++){
      		cin>>a[i];
      	}
      	sort(a+1,a+n+1);
      	init();
      	f[0][0][0]=1;
      	for(int i=0;i<n;i++){
      		for(int j=0;j<=i;j++){
      			for(int k=0;k<=m;k++){
      				f[i+1][j][k+a[i+1]]=(f[i][j][k]*2ll*j+f[i+1][j][k+a[i+1]])%mod;
      				f[i+1][j+1][k+1]=(f[i][j][k]*1ll*(j+1)+f[i+1][j+1][k+1])%mod;
      				if(j){
      					f[i+1][j-1][k+2*a[i+1]-1]=(f[i][j][k]*1ll*(j-1)+f[i+1][j-1][k+2*a[i+1]-1])%mod;
      				}
      			}
      		}
      	}
      	int ans=0;
      	for(int i=0;i<=m;i++){
      		ans=(C(m-i+n,n)*1ll*f[n][1][i]+ans)%mod;
      	}
      	cout<<ans;
      	return 0;
      }
      }
      int main(){return asbt::main();}
      

      C. 樹上染黑

      定義 \(f(u,A)\) 表示 \(u\)\(A\) 的虛樹的距離。

      \[\begin{aligned} \operatorname{ans}_{u} & =(n-1)(n-1)!+\sum_{\left\{a_{i}\right\}} \sum_{i=1}^{n-1}(n-i) f\left(a_{i},\left\{a_{0}, \ldots, a_{i-1}\right\}\right) \\ & =(n-1)(n-1)!+\sum_{v \neq u} \sum_{i=1}^{n-1}(n-i) \sum_{|A|=i, u \in A} f(v, A)(i-1)!(n-1-i)! \\ & =(n-1)(n-1)!+\sum_{v \neq u} \sum_{i=1}^{n-1}(n-i)!(i-1)!\sum_{|A|=i, u \in A} \sum_{w \in \operatorname{anc}_{v}}[\operatorname{Subtree}(w) \cap A=\varnothing] \\ & =(n-1)(n-1)!+\sum_{v \neq u} \sum_{i=1}^{n-1}(n-i)!(i-1)!\sum_{w \in \operatorname{anc}_{v}}\binom{n-1-\operatorname{siz}_{w}}{i-1} \\ & =(n-1)(n-1)!+\sum_{w \neq u} \sum_{i=1}^{n-1}(n-i)!(i-1)!\binom{n-1-\operatorname{siz}_{w}}{i-1} \operatorname{siz}_{w} \end{aligned} \]

      考慮預處理出 \(g_m=\sum_{i=1}^{n-1}(n-i)!(i-1)!{n-1-m\choose i-1}m\),于是可以換根求解。

      \[\begin{aligned} g_m&=\sum_{i=1}^{n-1}(n-i)!(i-1)!{n-1-m\choose i-1}m\\ &=m(n-m-1)!\sum_{i=1}^{n-1}\frac{(n-i)!}{(n-m-i)!}\\ &=m(n-m-1)!m!\sum_{i=1}^{n-1}{n-i\choose m}\\ &=m(n-m-1)!m!{n\choose m+1}\\ &=\frac{m}{m+1}n! \end{aligned} \]

      時間復雜度線性對數。

      Code
      #include<bits/stdc++.h>
      #define ll long long
      #define il inline
      #define pb push_back
      using namespace std;
      namespace asbt{
      const int maxn=1e6+5,mod=998244353;
      il int pls(int x,int y){
      	return x+y<mod?x+y:x+y-mod;
      }
      il void add(int &x,int y){
      	x=pls(x,y);
      }
      il int mns(int x,int y){
      	return x<y?x-y+mod:x-y;
      }
      il void sub(int &x,int y){
      	x=mns(x,y);
      }
      int n,fac[maxn],g[maxn],ans,sz[maxn],sum[maxn];
      vector<int> e[maxn];
      il int qpow(int x,int y=mod-2){
      	int res=1;
      	while(y){
      		if(y&1){
      			res=res*1ll*x%mod;
      		}
      		x=x*1ll*x%mod,y>>=1;
      	}
      	return res;
      }
      il void dfs1(int u,int fa){
      	sz[u]=1;
      	for(int v:e[u]){
      		if(v==fa){
      			continue;
      		}
      		dfs1(v,u);
      		add(ans,g[sz[v]]);
      		sz[u]+=sz[v];
      	}
      }
      il void dfs2(int u,int fa){
      	for(int v:e[u]){
      		if(v==fa){
      			continue;
      		}
      		add(ans,g[sz[1]-sz[v]]);
      		sub(ans,g[sz[v]]);
      		sum[v]=((n-1)*1ll*fac[n-1]+ans)%mod;
      		dfs2(v,u);
      		add(ans,g[sz[v]]);
      		sub(ans,g[sz[1]-sz[v]]);
      	}
      }
      int main(){
      	ios::sync_with_stdio(0),cin.tie(0);
      	cin>>n;
      	for(int i=1,u,v;i<n;i++){
      		cin>>u>>v;
      		e[u].pb(v),e[v].pb(u);
      	}
      	fac[0]=1;
      	for(int i=1;i<=n;i++){
      		fac[i]=fac[i-1]*1ll*i%mod;
      	}
      	for(int i=1;i<n;i++){
      		g[i]=i*1ll*fac[n]%mod*qpow(i+1)%mod;
      	}
      	dfs1(1,0);
      	sum[1]=((n-1)*1ll*fac[n-1]+ans)%mod;
      	dfs2(1,0);
      	for(int i=1;i<=n;i++){
      		cout<<sum[i]<<'\n';
      	}
      	return 0;
      }
      }
      int main(){return asbt::main();}
      

      D. 擺放花盆

      posted @ 2025-10-05 19:27  zhangxy__hp  閱讀(20)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日韩少妇人妻vs中文字幕| 国产jizzjizz视频| 亚洲粉嫩av一区二区黑人| 久久国产成人av蜜臀| 国产日韩AV免费无码一区二区三区| 蜜桃一区二区三区免费看| 视频一区二区三区四区不卡 | 精品国产成人亚洲午夜福利| 中文字幕国产日韩精品| 日本欧美大码a在线观看| 亚洲欧美一区二区成人片 | 无码精品国产va在线观看dvd | 色欲久久人妻内射| 免费AV片在线观看网址| 亚洲一品道一区二区三区| 亚洲国产精品久久久天堂麻豆宅男| 狠狠色综合tv久久久久久| 国产区一区二区现看视频| 18禁国产一区二区三区| 毛片tv网站无套内射tv网站| 国产精品成| 国产精品一区二区国产馆| 99国产欧美另类久久久精品| 男女啪啪高潮激烈免费版| 国产精品视频一区二区不卡| 男人av无码天堂| 国产免费又黄又爽又色毛| 国产福利午夜十八禁久久| 午夜无码国产18禁| 玩弄放荡人妻少妇系列| 国产精品嫩草99av在线| 欧洲亚洲国内老熟女超碰| 在线看无码的免费网站| 亚洲精品美女一区二区| 久久99热只有频精品6狠狠| 不卡国产一区二区三区| 亚洲熟妇在线视频观看| 国产精品美女AV免费观看| 日本亲近相奷中文字幕| 国产粉嫩学生高清专区麻豆| 欧美精品在线观看视频|