提出 #66389152


ソースコード 拡げる

#include<bits/stdc++.h>
#define For(i,l,r) for(int i=l,i##_e=r;i<=i##_e;++i)
#define rFor(i,r,l) for(int i=r,i##_e=l;i>=i##_e;--i)
#define y0 y_zero
#define y1 y_one
#define all(a) a.begin(),a.end()
#define cmin(a,b) a=min<remove_reference<decltype(a)>::type>(a,b)
#define cmax(a,b) a=max<remove_reference<decltype(a)>::type>(a,b)
#define vect basic_string
// #define ensure(_) ((_) || (__builtin_unreachable(),0))
using namespace std;
using u32=unsigned;
using i64=long long;
using ll=long long;
using u64=unsigned long long;
using ull=unsigned long long;
#if __SIZEOF_POINTER__==8
using i128=__int128;
using u128=__uint128_t;
#endif
using pii=array<int,2>;
using pll=array<ll,2>;
using a3=array<int,3>;
using a4=array<int,4>;
using a5=array<int,5>;
#define mtc() int T; cin>>T; while(T--) work();

#ifndef _MOD_INT_H
#define _MOD_INT_H
template<typename T=u32,T M=998244353,typename I=i64,typename U=u64> struct mint_static {
  private:
	using mint=mint_static;
	static constexpr void exgcd(I a,I b,I &x,I &y) {!b?(x=1,y=0):(exgcd(b,a%b,y,x),y-=x*(a/b));}
	static constexpr void mod(I &x) {
		x%=I(M); if(x<0) x+=M;
	}
	T x;
  public:
	static constexpr T getM(){return M;}
	constexpr T val()const{ return x; }
	static constexpr mint raw(T x){ mint s; s.x=x; return s; }
	constexpr mint inv()const{
		I _x=0,_y=0;
		exgcd(x,M,_x,_y);
		mod(_x); return raw(_x);
	}
	constexpr mint_static():x(0){};
	constexpr mint_static(I a):x((a%=I(M),a>=0?a:a+M)) {}
	constexpr mint& operator+=(const mint b) {
		if(int((x+=b.x)-M)>=0) x-=M;
		return *this;
	}
	constexpr mint& operator-=(const mint b) {
		x-=b.x; if(x>=M) x+=M;
		return *this;
	}
	constexpr mint& operator*=(const mint b) {
		x=U(x)*b.x%M; return *this;
	}
	constexpr mint& operator/=(const mint b) {return *this*=b.inv();}
	friend constexpr mint operator+(mint a,const mint b) {return a+=b;}
	friend constexpr mint operator-(mint a,const mint b) {return a-=b;}
	friend constexpr mint operator*(mint a,const mint b) {return a*=b;}
	friend constexpr mint operator/(mint a,const mint b) {return a/=b;}
	friend constexpr mint operator-(mint a) { if(a.x) a.x=M-a.x; return a; }
	friend constexpr bool operator!(const mint a) { return !a.x; }
	friend constexpr bool operator==(const mint a,const mint b) { return a.x==b.x; }
	friend constexpr bool operator!=(const mint a,const mint b) { return a.x!=b.x; }
#ifdef with_buffer
	template<size_t S> friend IO::my_istream<S>
	  operator>>(const IO::my_istream<S> in,mint &x) {
		I y; in>>y; x=y; return in;
	}
	template<size_t S> friend IO::my_ostream<S>
	  operator<<(const IO::my_ostream<S> out,const mint x) {
		out<<x.x; return out;
	}
#endif
	friend istream& operator>>(istream &in,mint &x) {
		I y; in>>y; x=y; return in;
	}
	friend ostream& operator<<(ostream &out,const mint x) {
		out<<x.x; return out;
	}
};
template<u32 M> using mintI=mint_static<u32,M>;
template<unsigned short M> using mintS=mint_static<unsigned short,M,int,u32>;
template<u64 M> using mintL=mint_static<u64,M,i128,u128>;
#endif // _MOD_INT_H
constexpr int M=998244353;
using mint=mintI<M>;

#ifndef _C_H
#define _C_H
template<typename mint> class Comb_t {
	static constexpr double alpha=1.3;
	static constexpr int Cm1m1=0; // Sometimes C(-1,-1)=1
	static vector<mint> f,g;
	static void init(int m) {
		if(m<int(f.size())) return; m*=alpha; if(m>=mint::getM()) m=mint::getM()-1;
		int n=f.size(); f.resize(m+1); g.resize(m+1);
		For(i,n,m) f[i]=f[i-1]*mint::raw(i);
		g[m]=f[m].inv(); rFor(i,m-1,n) g[i]=g[i+1]*mint::raw(i+1);
	}
  public:
	static mint C(int n,int m) {
		if(!~n && !~m) return Cm1m1;
		if(m<0 || n<m) return 0;
		init(n);
		return f[n]*g[m]*g[n-m];
	}
	static mint fac(int n) { init(n); return n<0?0:f[n]; }
	static mint ifac(int n) { init(n); return n<0?0:g[n]; }
	static mint _inv(int n) { init(n); return n<=0?0:g[n]*f[n-1]; }
};
template<typename mint> vector<mint> Comb_t<mint>::f{1};
template<typename mint> vector<mint> Comb_t<mint>::g{1};
#endif // _C_H
using Comb=Comb_t<mint>;
static auto C=Comb::C; static auto fac=Comb::fac,ifac=Comb::ifac,_inv=Comb::_inv;

struct nd {
	mint f,g;
	nd operator+(const nd b)const{
		return {f+b.f,g+b.g};
	}
	nd operator*(const nd b)const{
		return {f*b.f,g*b.f+f*b.g};
	}
	nd ad(int s) { return {f,g+f*s}; }
};
nd get(mint x,mint y) {
	return {x,x*y};
}
const int N=2e5+10,B=1000;
int n,m;
nd to[B][B];
vector<nd> f[N];
int main() {
#ifdef LOCAL
	freopen(".in","r",stdin);
	// freopen(".out","w",stdout);
	// freopen(".debug","w",stderr);
#endif
#ifndef with_buffer
	ios::sync_with_stdio(0); cin.tie(0);
#endif
	cin>>n>>m;
	if(n<m) swap(n,m);
	For(i,1,m) {
		For(x,0,i) For(y,0,max(0,i-x-1)) {
			to[i][y]=to[i][y]+get(C(max(0,i-x-1),y),x);
		}
	}
	For(i,0,n) f[i].resize(m+1),f[i][0]={1,0};
	For(i,0,m) f[0][i]={1,0};
	For(i,1,n) For(j,1,m) {
		For(k,0,j) {
			f[i][j]=f[i][j]+f[i-1][j-k]*(to[j][k].ad(i*k));
		}
	}
	cout<<f[n][m].g<<"\n";
}

提出情報

提出日時
問題 D - Limestone
ユーザ Z_301
言語 C++ 17 (gcc 12.2)
得点 1000
コード長 5042 Byte
結果 AC
実行時間 373 ms
メモリ 14476 KiB

コンパイルエラー

Main.cpp: In static member function ‘static void Comb_t<mint>::init(int)’:
Main.cpp:100:17: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
  100 |                 if(m<int(f.size())) return; m*=alpha; if(m>=mint::getM()) m=mint::getM()-1;
      |                 ^~
Main.cpp:100:45: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
  100 |                 if(m<int(f.size())) return; m*=alpha; if(m>=mint::getM()) m=mint::getM()-1;
      |                                             ^
Main.cpp: In instantiation of ‘static void Comb_t<mint>::init(int) [with mint = mint_static<unsigned int, 998244353, long long int, long long unsigned int>]’:
Main.cpp:109:7:   required from ‘static mint Comb_t<mint>::C(int, int) [with mint = mint_static<unsigned int, 998244353, long long int, long long unsigned int>]’
Main.cpp:120:21:   required from here
Main.cpp:100:59: warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]
  100 |                 if(m<int(f.size())) return; m*=alpha; if(m>=mint::getM()) m=mint::getM()-1;
      |                                                          ~^~~~~~~~~~~~~~
Main.cpp: At global scope:
Main.cpp:120:66: warning: ‘_inv’ defined but not used [-Wunused-variable]
  120 | static auto C=Comb::C; static auto fac=Comb::fac,ifac=Comb::ifac,_inv=Comb::_inv;
      |                                                                  ^~~~
Main.cpp:120:50: warning: ‘ifac’ defined but not used [-Wunused-variable]
  120 | static auto C=Comb::C; static auto fac=Comb::fac,ifac=Comb::ifac,_inv=Comb::_inv;
      |                                                  ^~~~
Main.cpp:120:36: warning: ‘fac’ defined but not used [-Wunused-variable]
  120 | static auto C=Comb::C; static auto fac=Comb::fac,ifac=Comb::ifac,_inv=Comb::_inv;
      |                                    ^~~

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 1000 / 1000
結果
AC × 3
AC × 34
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_test_00.txt, 01_test_01.txt, 01_test_02.txt, 01_test_03.txt, 01_test_04.txt, 01_test_05.txt, 01_test_06.txt, 01_test_07.txt, 01_test_08.txt, 01_test_09.txt, 01_test_10.txt, 01_test_11.txt, 01_test_12.txt, 01_test_13.txt, 01_test_14.txt, 01_test_15.txt, 01_test_16.txt, 01_test_17.txt, 01_test_18.txt, 01_test_19.txt, 01_test_20.txt, 01_test_21.txt, 01_test_22.txt, 01_test_23.txt, 01_test_24.txt, 01_test_25.txt, 01_test_26.txt, 01_test_27.txt, 01_test_28.txt, 01_test_29.txt, 01_test_30.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 3 ms 8120 KiB
00_sample_01.txt AC 3 ms 8140 KiB
00_sample_02.txt AC 27 ms 9292 KiB
01_test_00.txt AC 8 ms 10084 KiB
01_test_01.txt AC 9 ms 10500 KiB
01_test_02.txt AC 12 ms 10048 KiB
01_test_03.txt AC 14 ms 9704 KiB
01_test_04.txt AC 23 ms 9788 KiB
01_test_05.txt AC 55 ms 9916 KiB
01_test_06.txt AC 93 ms 10032 KiB
01_test_07.txt AC 249 ms 11276 KiB
01_test_08.txt AC 137 ms 10440 KiB
01_test_09.txt AC 40 ms 9732 KiB
01_test_10.txt AC 41 ms 10168 KiB
01_test_11.txt AC 23 ms 9712 KiB
01_test_12.txt AC 13 ms 9656 KiB
01_test_13.txt AC 8 ms 10068 KiB
01_test_14.txt AC 8 ms 10720 KiB
01_test_15.txt AC 8 ms 11680 KiB
01_test_16.txt AC 11 ms 13564 KiB
01_test_17.txt AC 356 ms 12044 KiB
01_test_18.txt AC 363 ms 11996 KiB
01_test_19.txt AC 351 ms 11908 KiB
01_test_20.txt AC 361 ms 11976 KiB
01_test_21.txt AC 355 ms 11936 KiB
01_test_22.txt AC 357 ms 11924 KiB
01_test_23.txt AC 360 ms 12008 KiB
01_test_24.txt AC 370 ms 12048 KiB
01_test_25.txt AC 362 ms 11956 KiB
01_test_26.txt AC 359 ms 12012 KiB
01_test_27.txt AC 3 ms 8160 KiB
01_test_28.txt AC 12 ms 14464 KiB
01_test_29.txt AC 12 ms 14476 KiB
01_test_30.txt AC 373 ms 12044 KiB