Submission #67787497


Source Code Expand

// created:  2025-07-20 20:44:52
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<atcoder/convolution>
#define F(i,l,r) for(int i=l,i##_end=r;i<i##_end;++i)
#define I128 //||is_same<T,__int128_t>::value||is_same<T,__uint128_t>::value
using namespace std;
template<typename T>enable_if_t<is_integral<T>::value I128,void> readmain(T &x)
{
	bool neg=false;int c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')neg=true;
	for(x=0;isdigit(c);c=getchar())x=(T)(10*x+(c-'0'));
	if(neg)x=-x;
}
template<typename T>T& read(T &x){readmain(x);return x;}
template<typename T,typename ...Tr>void read(T &x,Tr&... r){readmain(x);read(r...);}
typedef atcoder::modint998244353 mint;
constexpr int N=3e5+5,B=1000;
mint fac[N],ifac[N];
mint bn(int n,int m){return fac[n]*ifac[m]*ifac[n-m];}
vector<mint> solve(int n,int m,int vs,int vt)
{
	vector<mint> ans(m+1);--vs;--vt;
	if(n<=B)
	{
		vector<mint> f(n),g(n);
		f[vs]=1;
		F(i,0,m+1)
		{
			if(i)
			{
				F(j,1,n-1)g[j]=f[j-1]+f[j+1];
				g[0]=0;
				F(j,1,min(n,2))g[0]+=f[j];
				g[n-1]=0;
				F(j,max(0,n-2),n-1)g[n-1]+=f[j];
				swap(f,g);
			}
			ans[i]=f[vt];
		}
	}
	else
	{
		F(i,0,m+1)
		{
			if((i^vs^vt)&1)continue;
			mint sgn=1;
			for(int is=vs,ax=n;;is=2*ax-is,ax+=n+1,sgn=-sgn)
			{
				if(abs(vt-is)>i)break;
				ans[i]+=sgn*bn(i,(vt-is+i)>>1);
			}
			sgn=1;
			for(int is=vs,ax=-1;is=2*ax-is,ax-=n+1,sgn=-sgn,1;)
			{
				if(abs(vt-is)>i)break;
				ans[i]+=sgn*bn(i,(vt-is+i)>>1);
			}
		}
	}
	return ans;
}
vector<mint> trans(vector<mint> a,bool sgn)
{
	int n=(int)a.size();
	vector<mint> b(n);
	F(i,0,n)a[i]*=ifac[i],b[i]=sgn&&(i&1)?-ifac[i]:ifac[i];
	a=atcoder::convolution(a,b);
	a.resize(n);
	F(i,0,n)a[i]*=fac[i];
	return a;
}
int main()
{
	fac[0]=1;
	F(i,1,N)fac[i]=fac[i-1]*mint::raw(i);
	ifac[N-1]=fac[N-1].inv();
	for(int i=N;--i;)ifac[i-1]=ifac[i]*mint::raw(i);
	int h,w,t,a,b,c,d;read(h,w,t,a,b,c,d);
	vector<mint> v1=solve(h,t,a,c);
	vector<mint> v2=solve(w,t,b,d);
	v1=trans(v1,false);
	v2=trans(v2,false);
	F(i,0,t+1)v1[i]*=v2[i];
	v1=trans(v1,true);
	printf("%d\n",v1[t].val());
	return 0;
}

Submission Info

Submission Time
Task D - King
User liuhengxi
Language C++ 17 (gcc 12.2)
Score 1000
Code Size 2168 Byte
Status AC
Exec Time 506 ms
Memory 26036 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1000 / 1000
Status
AC × 2
AC × 18
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 02_max_00.txt, 02_max_01.txt, 02_max_02.txt, 03_corner_00.txt, 03_corner_01.txt, 04_sqrt_00.txt, 04_sqrt_01.txt, 04_sqrt_02.txt, 04_sqrt_03.txt, 04_sqrt_04.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 4 ms 5464 KiB
00_sample_01.txt AC 4 ms 5520 KiB
01_random_00.txt AC 85 ms 16988 KiB
01_random_01.txt AC 155 ms 25844 KiB
01_random_02.txt AC 199 ms 25888 KiB
01_random_03.txt AC 161 ms 26036 KiB
01_random_04.txt AC 154 ms 25864 KiB
01_random_05.txt AC 155 ms 25868 KiB
02_max_00.txt AC 154 ms 25924 KiB
02_max_01.txt AC 153 ms 25872 KiB
02_max_02.txt AC 154 ms 25952 KiB
03_corner_00.txt AC 154 ms 25932 KiB
03_corner_01.txt AC 82 ms 16536 KiB
04_sqrt_00.txt AC 205 ms 25944 KiB
04_sqrt_01.txt AC 264 ms 25888 KiB
04_sqrt_02.txt AC 369 ms 25896 KiB
04_sqrt_03.txt AC 506 ms 25868 KiB
04_sqrt_04.txt AC 320 ms 25956 KiB