ARC 好题精选 1

【未完稿】

AT_arc111_c [ARC111C] Too Heavy

有 \(N\) 个人,编号为 \(1\) 到 \(N\),以及 \(N\) 个编号同样为 \(1\) 到 \(N\) 的行李。第 \(i\) 个人的体重为 \(a_i\),第 \(j\) 个行李的重量为 \(b_j\)。一开始,第 \(i\) 个人拿着编号为 \(p_i\) 的行李。你可以进行如下操作若干次(可以为 \(0\) 次),使得最终每个人都拿着与自己编号相同的行李。

  • 选择 \(i, j\ (i \neq j)\),交换第 \(i\) 个人和第 \(j\) 个人手中的行李。

但是,如果某个人拿着的行李重量大于等于自己的体重,他就会感到疲劳,之后不能再参与任何操作(即不能再被选为 \(i\) 或 \(j\))。特别地,如果 \(a_i \leq b_{p_i}\),那么这个人一开始就无法参与任何操作。

请判断是否存在满足条件的操作序列。如果存在,请构造一个操作次数最少的方案。

其中 \(K\) 为操作次数,\(i_t, j_t\) 表示第 \(t\) 次操作选择的两个人的编号。

如果有多种方案,输出任意一种均可。

  • \(1 \leq N \leq 200000\)
  • \(1 \leq a_i, b_i \leq 10^9\)
  • \(p\) 是 \(1, \ldots, N\) 的一个排列

sol

考虑 \(i\) 向 \(p_i\) 连边,一定得到多个互不相交的多元环。

如果某个 \(i\) 已经拿对了,即 \(p_i=i\) 那么就是一个自环:\(i \to i\),可以认为它已经解决,不需要操作。

从一个 \(a_i\) 最小的点开始操作,肯定不会阻挡后面的点进行操作。

实际上实现时不需要每次重新找最小值,直接把所有点按照 \(a_i\) 从小到大排序,然后依次处理即可。

AT_arc106_d [ARC106D] Powers

给定一个长度为 \(N\) 的整数序列 \(A = (A_1, A_2, \cdots, A_N)\) 和一个整数 \(K\)。

对于每一个满足 \(1 \le X \le K\) 的整数 \(X\),请计算以下值:

\[\left(\sum_{L=1}^{N-1} \sum_{R=L+1}^{N} (A_L + A_R)^X\right) \bmod 998244353 \]

  • 输入均为整数。
  • \(2 \le N \le 2 \times 10^5\)
  • \(1 \le K \le 300\)
  • \(1 \le A_i \le 10^8\)

sol

\[\begin{aligned} \sum_{1\le L<R\le N}(A_L+A_R)^x &= \sum_{L=1}^{N-1}\sum_{R=L+1}^{N}(A_L+A_R)^x\\ &= \sum_{L=1}^{N-1}\sum_{R=L+1}^{N} \sum_{k=0}^{x}\binom{x}{k}A_L^kA_R^{x-k}\\ &= \sum_{k=0}^{x}\binom{x}{k}\sum_{L=1}^{N-1}\sum_{R=L+1}^{N}A_L^kA_R^{x-k}\\ \end{aligned} \]

不难发现,\(L,R\) 是对称的:

\[\sum_{1\le L<R\le N}(A_L+A_R)^x = \frac{1}{2} \sum_{k=0}^{x}\binom{x}{k} \left[ \left(\sum_{i=1}^{N}A_i^k\right) \left(\sum_{i=1}^{N}A_i^{x-k}\right) - \sum_{i=1}^{N}A_i^x \right] \]

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=998244353;
int n,K;
int a[200005]; 
int f[305][200005];
int g[305];
int ft[305],invft[305]; 
int f1[305];
int qpow(int a,int b){
	int h=a,ans=1;
	while(b){
		if(b&1) ans*=h,ans%=mod;
		h*=h;
		h%=mod;
		b>>=1;
	}
	return ans;
}
signed main(){
	cin>>n>>K;
	ft[0]=invft[0]=1;
	for(int i=1;i<=300;i++){
		ft[i]=ft[i-1]*i;
		ft[i]%=mod;
		invft[i]=qpow(ft[i],mod-2);
	}
	for(int i=1;i<=n;i++){
		cin>>a[i];
		f[0][i]=1;
		f[1][i]=a[i];
		for(int j=2;j<=300;j++){
			f[j][i]=f[j-1][i]*a[i];
			f[j][i]%=mod;
		}
	}
	for(int k=0;k<=300;k++){
		for(int i=1;i<=n;i++){
			f1[k]+=f[k][i];
			f1[k]%=mod;
		} 		
	}	
	for(int i=1;i<=K;i++){
		int w=0;
		for(int k=0;k<=i;k++){
			int h=qpow(2,mod-2);
			h*=ft[i];
			h%=mod;
			h*=invft[k];
			h%=mod;
			h*=invft[i-k];
			h%=mod;
			int ans=0;
			int r=1;
			r*=f1[k];
			r%=mod;
			r*=f1[i-k];
			r%=mod;
			r-=f1[i];
			r=(r+mod)%mod;
			h*=r;
			h%=mod;
			w+=h;
			w%=mod;
		}
		g[i]=w;
	}
	for(int i=1;i<=K;i++){
		cout<<g[i]<<endl;
	}
	return 0;
}
posted @ 2026-09-02 22:43  easy42  阅读(22)  评论(0)    收藏  举报