列表

详情


NC229574. D 与 R

描述

许久以前,R 曾问了 D 一个问题:

给定一个 的网格和两个序列 (i,j) 是黑的当且仅当 (i,j) 是白的当且仅当 (其中 )。称此时黑色联通块数量与白色联通块数量之差为此时的答案。

但是因为过去太久,D 已经记不得 ab 了。因此现在,他给出 n,m,K,x,请帮他求出当  取值得到的 种以上问题的输入中,答案的和,模 998244353

输入描述

第一行一个正整数 T,为数据组数()。

接下来 T 行,每行四个正整数 n,m,K,x)。

输出描述

输出 T 行,每行一个非负整数,为本次询问答案模 998244353 的值。

示例1

输入:

5
2 2 2 2
1 5 3 4
114514 1919810 19260817 23333333
283 439 122 39
402 355 294 933

输出:

998244346
189
829344787
424480115
0

说明:

为了节约篇幅,这里只解释第一组数据。

第一组数据中,一共有 16 种情况,如下图所示,有九种情况答案为 0,七种情况答案为 -1,所以和为 -7,对 998244353 取模得到 998244346

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 49ms, 内存消耗: 432K, 提交时间: 2021-11-27 08:35:10

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
int Power(int x,int y){
	int ret=1;
	while(y) {
		if(y&1)ret=1ll*ret*x%mod;
		x=1ll*x*x%mod,y>>=1;
	}
	return ret;
}
int S1(int l,int r){
	return 1ll*(l+r)*(r-l+1)/2%mod;
}
int S2r(int r){
	return 1ll*r*(r+1)%mod*(2*r+1)%mod*(mod+1)/6%mod;
}
int S2(int l,int r){
	return (S2r(r)-S2r(l-1)+mod)%mod;
}
int S3r(int r){
	return 1ll*S1(1,r)*S1(1,r)%mod;
}
int S3(int l,int r){
	return (S3r(r)-S3r(l-1)+mod)%mod;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		int n,m,K,x,ans=0;
		cin>>n>>m>>K>>x,x=min(x,K*2);
		if(x<=K+1){
			ans=(ans+1ll*x*(x-1)/2%mod*Power(1ll*K*K%mod,mod-2)%mod*n%mod*m%mod)%mod;
			ans=(ans-1ll*S2r(x-1)*Power(1ll*K*K%mod*K%mod,mod-2)%mod*n%mod*(m-1)%mod+mod)%mod;
			ans=(ans-1ll*S2r(x-1)*Power(1ll*K*K%mod*K%mod,mod-2)%mod*(n-1)%mod*m%mod+mod)%mod;
			
			ans=(ans+2ll*S3r(x-1)*Power(1ll*K*K%mod*K%mod*K%mod,mod-2)%mod*(n-1)%mod*(m-1)%mod)%mod;
			ans=(ans+2ll*x*x%mod*S1(1,x-1)%mod*Power(1ll*K*K%mod*K%mod*K%mod,mod-2)%mod*(n-1)%mod*(m-1)%mod)%mod;
			ans=(ans-4ll*x%mod*S2(1,x-1)%mod*Power(1ll*K*K%mod*K%mod*K%mod,mod-2)%mod*(n-1)%mod*(m-1)%mod+mod)%mod;
			
			ans=(ans-1ll*S2r(x-1)*Power(1ll*K*K%mod*K%mod*K%mod,mod-2)%mod*(n-1)%mod*(m-1)%mod+mod)%mod;
		}
		else {
			ans=(ans+1ll*S1(x-K,K-1)*Power(1ll*K*K%mod,mod-2)%mod*n%mod*m%mod)%mod;
			ans=(ans+1ll*K*(x-K)%mod*Power(1ll*K*K%mod,mod-2)%mod*n%mod*m%mod)%mod;
			ans=(ans-1ll*S2(x-K,K-1)*Power(1ll*K*K%mod*K%mod,mod-2)%mod*n%mod*(m-1)%mod+mod)%mod;
			ans=(ans-1ll*S2(x-K,K-1)*Power(1ll*K*K%mod*K%mod,mod-2)%mod*(n-1)%mod*m%mod+mod)%mod;
			ans=(ans-1ll*K*K%mod*(x-K)%mod*Power(1ll*K*K%mod*K%mod,mod-2)%mod*n%mod*(m-1)%mod+mod)%mod;
			ans=(ans-1ll*K*K%mod*(x-K)%mod*Power(1ll*K*K%mod*K%mod,mod-2)%mod*(n-1)%mod*m%mod+mod)%mod;
			
			ans=(ans+2ll*S3(x-K+1,K)*Power(1ll*K*K%mod*K%mod*K%mod,mod-2)%mod*(n-1)%mod*(m-1)%mod)%mod;
			ans=(ans+2ll*x*x%mod*S1(x-K+1,K)%mod*Power(1ll*K*K%mod*K%mod*K%mod,mod-2)%mod*(n-1)%mod*(m-1)%mod)%mod;
			ans=(ans-4ll*x%mod*S2(x-K+1,K)%mod*Power(1ll*K*K%mod*K%mod*K%mod,mod-2)%mod*(n-1)%mod*(m-1)%mod+mod)%mod;
			ans=(ans+2ll*K*K%mod*S1(1,x-K)%mod*Power(1ll*K*K%mod*K%mod*K%mod,mod-2)%mod*(n-1)%mod*(m-1)%mod)%mod;
			
			ans=(ans-1ll*S2(x-K,K-1)*Power(1ll*K*K%mod*K%mod*K%mod,mod-2)%mod*(n-1)%mod*(m-1)%mod+mod)%mod;
			ans=(ans-1ll*K*K%mod*(x-K)%mod*Power(1ll*K*K%mod*K%mod*K%mod,mod-2)%mod*(n-1)%mod*(m-1)%mod+mod)%mod;
		}
		ans=(ans-1+mod)%mod;
		cout<<1ll*ans*Power(K,n+m)%mod<<'\n';
	}
}

上一题