cf 493 div.1 C

本文介绍了一种使用容斥原理解决矩阵染色问题的方法。针对一个n*n的矩阵,使用三种颜色进行染色,确保至少存在一行或一列的颜色完全相同。通过数学公式推导并实现了具体的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给出n*n的矩阵,用三种颜色染色,保证至少有一行或一列颜色全部相同


题解

容斥,推式子,把只选行或列单列出来

详见:点击打开链接

根据式子来写就好了,注意细节

#include<bits/stdc++.h>
using namespace std;
#define maxn 1000020

typedef long long ll;
const ll p = 998244353;
ll fac[maxn],inv[maxn],pow_[maxn],ans;
int n;

inline ll pow_er(ll x,int y){
	ll res = 1;
	while ( y ) {
		if ( y & 1 ) res = res * x % p;
		x = x * x % p;
		y >>= 1;
	}
	return res;
}
void init(){
	fac[0] = 1 , pow_[0] = 1;
	for (int i = 1 ; i <= n ; i++){
		fac[i] = fac[i - 1] * i % p;
		pow_[i] = pow_[i - 1] * 3 % p;
	}
	inv[n] = pow_er(fac[n],p - 2);
	for (int i = n - 1 ; i >= 1 ; i--) inv[i] = inv[i + 1] * (i + 1) % p;
}
inline ll C(int n,int m){
	if ( n == m || !m ) return 1;
	return fac[n] * inv[m] % p * inv[n - m] % p;
}
void calc(){
//	if ( n == 1 ){ ans = 3; return; }
	for (int i = 1 ; i <= n ; i++){
	   if ( i & 1 )	ans = (ans + C(n,i) * pow_[i] % p * pow_er(pow_[n - i],n) * 2) % p;
	   else ans = ((ans - C(n,i) * pow_[i] % p * pow_er(pow_[n - i],n) * 2) % p + p) % p;
	}
	for (int i = 0 ; i < n ; i++){
		ll cur = 3ll * C(n,i) * (pow_er(1 - pow_[i],n) - pow_er(-pow_[i],n)) % p;
		if ( i & 1 ) ans = (ans + cur) % p;
		else ans = (ans - cur + p) % p;
	}
	ans = (ans % p + p) % p;
}
int main(){
	scanf("%d",&n);
	init();
	calc();
	cout<<ans<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值