結果

問題 No.2932 えっえっ嘘嘘嘘待って待って待って???えマジで?ほんとに?マジでやばすぎなんだけど?えっおっほんとにこんなにDPしちゃっていいんですかい???マジでやばすぎなんだけど???
ユーザー こめだわらこめだわら
提出日時 2024-10-12 16:21:33
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 42 ms / 2,000 ms
コード長 1,841 bytes
コンパイル時間 257 ms
コンパイル使用メモリ 82,424 KB
実行使用メモリ 60,288 KB
最終ジャッジ日時 2024-10-12 16:21:35
合計ジャッジ時間 1,363 ms
ジャッジサーバーID
(参考情報)
judge / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 31 ms
52,352 KB
testcase_01 AC 35 ms
52,864 KB
testcase_02 AC 40 ms
59,648 KB
testcase_03 AC 33 ms
52,480 KB
testcase_04 AC 35 ms
52,224 KB
testcase_05 AC 34 ms
52,480 KB
testcase_06 AC 33 ms
52,736 KB
testcase_07 AC 39 ms
59,776 KB
testcase_08 AC 38 ms
60,288 KB
testcase_09 AC 38 ms
60,160 KB
testcase_10 AC 42 ms
60,032 KB
testcase_11 AC 34 ms
52,480 KB
testcase_12 AC 32 ms
52,864 KB
testcase_13 AC 40 ms
59,904 KB
testcase_14 AC 42 ms
60,160 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

class factorial():
    def __init__(self,n=0,mod=998244353):
        self.mod=mod
        self.fact_n=[1]
        self.fact_i=[1]
        self.fact_l=0
        self.create(n)
    
    def create(self,n):
        if self.fact_l<n:
            for i in range(self.fact_l+1,n+1):
                self.fact_n.append((self.fact_n[-1]*i)%self.mod)
                self.fact_i.append(0)
            self.fact_i[n]=pow(self.fact_n[n],self.mod-2,self.mod)
            for i in range(n,self.fact_l+1,-1):
                self.fact_i[i-1]=(self.fact_i[i]*i)%self.mod
            self.fact_l=n
        
    def fact(self,n):
        assert n>=0
        if n>self.fact_l:
            self.create(n)
        return self.fact_n[n]
    
    def fact_inv(self,n):
        assert n>=0
        if n>self.fact_l:
            self.create(n)
        return self.fact_i[n]

    def perm(self,n,r):
        if r<0:
            return 0
        if n>=0:
            if n<r:
                return 0
            return (self.fact(n)*self.fact_inv(n-r))%self.mod
        elif n<0:
            ret=(self.fact(-n+r-1)*self.fact_inv(-n-1))%self.mod
            if r%2==1:
                ret=-ret
                ret%=self.mod
            return ret
    
    def comb(self,n,r):
        if r<0:
            return 0
        if n>=0:
            if n<r:
                return 0
            return (self.fact(n)*self.fact_inv(n-r)*self.fact_inv(r))%self.mod
        elif n<0:
            ret=(self.fact(-n+r-1)*self.fact_inv(-n-1)*self.fact_inv(r))%self.mod
            if r%2==1:
                ret=-ret
                ret%=self.mod
            return ret
    

H,W,M=map(int,input().split())
Mod=998244353
f=factorial(H+W+10,Mod)
r=f.comb(H+W-2,H-1)
g=pow(M,H*W-H-W+1,Mod)

t=1
for i in range(H+W-1):
    t*=M-i
    t%=Mod

t*=f.fact_inv(H+W-1)
t%=Mod
print(r*g*t%Mod)
0