其他分享
首页 > 其他分享> > CodeForces - 997C Sky Full of Stars

CodeForces - 997C Sky Full of Stars

作者:互联网

目录

题目

传送门

解法

令 \(f(x,y)\) 为钦定 \(x\) 行 \(y\) 列为同种颜色的方案数,\(g(x,y)\) 为恰好 \(x\) 行 \(y\) 列为同种颜色的方案数,可以想到,当 \(x,y>0\) 时,\(x\) 行 \(y\) 列必须是同种颜色。答案就是 \(3^{n^2}-g(0,0)\)。

那么由高维二项式反演有:

\[f(x,y)=\sum_{i=x}^n\sum_{j=y}^n \binom{i}{x}\binom{j}{y}g(i,j) \]

\[g(x,y)=\sum_{i=x}^n\sum_{j=y}^n (-1)^{i-x+j-y}\binom{i}{x}\binom{j}{y}f(i,j) \]

\[g(0,0)=\sum_{i=0}^n\sum_{j=0}^n (-1)^{i+j}f(i,j) \]

大力分类讨论:

代码

#include <cstdio>
#define print(x,y) write(x),putchar(y)

template <class T>
inline T read(const T sample) {
	T x=0; char s; bool f=0;
	while((s=getchar())>'9' or s<'0')
		f|=(s=='-');
	while(s>='0' and s<='9')
		x=(x<<1)+(x<<3)+(s^48),
		s=getchar();
	return f?-x:x;
}

template <class T>
inline void write(const T x) {
	if(x<0) {
		putchar('-'),write(-x);
		return;
	}
	if(x>9) write(x/10);
	putchar(x%10^48);
} 

const int mod=998244353,maxn=1e6+5;
const int phi=mod-1;

int n,inv[maxn];

int qkpow(int x,int y) {
	int r=1;
	while(y) {
		if(y&1) r=1ll*r*x%mod;
		x=1ll*x*x%mod; y>>=1;
	}
	return r;
}

int main() {
	n=read(9);
	int C=1,ans=0,tmp;
	inv[1]=1;
	for(int i=2;i<=n;++i)
		inv[i]=(mod-1ll*mod/i*inv[mod%i]%mod)%mod;
	for(int i=1;i<=n;++i) {
		C=1ll*C*(n-i+1)%mod*inv[i]%mod;
		tmp=1ll*C*qkpow(3,phi-1ll*n*i%phi)%mod*(qkpow(1-qkpow(3,(i-n+phi)%phi)+mod,n)-1+mod)%mod;
		if(i&1) ans=(ans+tmp)%mod;
		else ans=(ans-tmp+mod)%mod;
	}
	ans=1ll*ans*qkpow(3,(1ll*n*n+1)%phi)%mod;
	ans=(ans-2ll*qkpow(3,1ll*n*n%phi)%mod*(qkpow(1-qkpow(3,phi-n+1)+mod,n)-1+mod)%mod+mod)%mod;
	print(ans,'\n');
	return 0;
}

标签:Full,997C,int,sum,Sky,cdot,const,binom,mod
来源: https://www.cnblogs.com/AWhiteWall/p/13991553.html