提出 #68726202


ソースコード 拡げる

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

using ll=long long;

#define rng(i,a,b) for(int i=int(a);i<int(b);i++)
#define rep(i,b) rng(i,0,b)
#define gnr(i,a,b) for(int i=int(b)-1;i>=int(a);i--)
#define per(i,b) gnr(i,0,b)
#define pb push_back
#define eb emplace_back
#define a first
#define b second
#define bg begin()
#define ed end()
#define all(x) x.bg,x.ed
#define si(x) int(x.size())
#ifdef LOCAL
#define dmp(x) cerr<<__LINE__<<" "<<#x<<" "<<x<<endl
#else
#define dmp(x) void(0)
#endif

template<class t,class u> bool chmax(t&a,u b){if(a<b){a=b;return true;}else return false;}
template<class t,class u> bool chmin(t&a,u b){if(b<a){a=b;return true;}else return false;}

template<class t> using vc=vector<t>;
template<class t> using vvc=vc<vc<t>>;

using P=pair<int,int>;
using vi=vc<int>;
const uint mod=998244353;
struct mint{
	uint v;
	mint(ll vv=0){s(vv%mod+mod);}
	mint& s(uint vv){
		v=vv<mod?vv:vv-mod;
		return *this;
	}
	mint operator-()const{return mint()-*this;}
	mint& operator+=(const mint&r){return s(v+r.v);}
	mint&operator-=(const mint&r){return s(v+mod-r.v);}
	mint&operator*=(const mint&r){v=(unsigned long long)v*r.v%mod;return *this;}
	mint&operator/=(const mint&r){return *this*=r.inv();}
	mint operator+(const mint&r)const{return mint(*this)+=r;}
	mint operator-(const mint&r)const{return mint(*this)-=r;}
	mint operator*(const mint&r)const{return mint(*this)*=r;}
	mint operator/(const mint&r)const{return mint(*this)/=r;}
	mint pow(ll n)const{
		if(n<0)return inv().pow(-n);
		mint res(1),x(*this);
		while(n){
			if(n&1)res*=x;
			x*=x;
			n>>=1;
		}
		return res;
	}
	mint inv()const{return pow(mod-2);}
};
#define SIZE 5005
mint inv[SIZE],fac[SIZE],finv[SIZE];
void make(){
	fac[0]=fac[1]=1;
	finv[0]=finv[1]=1;
	inv[1]=1;
	for(int i=2;i<SIZE;i++){
		inv[i]=-inv[mod%i]*(mod/i);
		fac[i]=fac[i-1]*i;
		finv[i]=finv[i-1]*inv[i];
	}
}
mint C(int a,int b){
	if(a<b) return 0;
	return fac[a]*(finv[b]*finv[a-b]);
}

mint run(int n,int k,int x){
	if(x<0) return 0;
	mint ret=0;
	vc<vc<mint>> dp(k,vc<mint>(x+1));
	vc<mint> tw(k);
	tw[0]=1;
	for(int i=1;i<k;i++) tw[i]=tw[i-1]*2;
	for(int i=0;i<=2*x+1;i++){
		mint cur=C(i+n-1,i);
		if(i<x+1){
			mint zan=tw[k-1].pow(n);
			ret+=cur*zan;
		} else{
			dp[k-1][i-x-1]+=cur;
		}
	}
	for(int i=k-1;i>0;i--){
		mint zan=tw[i-1].pow(n);
		for(int j=0;j<=x;j++){
			for(int c=0;c<=n;c++){
				mint w=C(n,c)*dp[i][j];
				int nt=2*j+(c-x-1);
				if(nt<0){
					ret+=zan*w;
				} else if(nt<=x){
					dp[i-1][nt] += w;
				}
			}
		}
	}
	return ret;
}
void solve(){
	make();
	int n,k,x;
	cin>>n>>k>>x;
	mint ans=run(n,k,x) - run(n,k,x-1);
	cout<<ans.v<<endl;
}
int main(){
	cin.tie(0);
	ios::sync_with_stdio(0);
	cout<<fixed<<setprecision(20);
	int T=1;
	while(T--) solve();
}

提出情報

提出日時
問題 A - CatCoder Binary Contest
ユーザ yutaka1999
言語 C++ 23 (Clang 16.0.6)
得点 700
コード長 2872 Byte
結果 AC
実行時間 110 ms
メモリ 3832 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 700 / 700
結果
AC × 3
AC × 21
セット名 テストケース
Sample sample-01.txt, sample-02.txt, sample-03.txt
All 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, sample-01.txt, sample-02.txt, sample-03.txt
ケース名 結果 実行時間 メモリ
01-01.txt AC 110 ms 3644 KiB
01-02.txt AC 109 ms 3660 KiB
01-03.txt AC 39 ms 3636 KiB
01-04.txt AC 47 ms 3832 KiB
01-05.txt AC 43 ms 3672 KiB
01-06.txt AC 1 ms 3596 KiB
01-07.txt AC 1 ms 3540 KiB
01-08.txt AC 1 ms 3516 KiB
01-09.txt AC 1 ms 3692 KiB
01-10.txt AC 1 ms 3600 KiB
01-11.txt AC 1 ms 3500 KiB
01-12.txt AC 2 ms 3668 KiB
01-13.txt AC 1 ms 3580 KiB
01-14.txt AC 1 ms 3692 KiB
01-15.txt AC 92 ms 3816 KiB
01-16.txt AC 104 ms 3696 KiB
01-17.txt AC 106 ms 3616 KiB
01-18.txt AC 107 ms 3656 KiB
sample-01.txt AC 1 ms 3560 KiB
sample-02.txt AC 1 ms 3572 KiB
sample-03.txt AC 109 ms 3676 KiB