神はそれがカウント良い質問です。
コード:
書式#include <cstdioを> 書式#include <アルゴリズム> 書式#include <CStringの> #define N 5000003 #define LL長い長いです #defineモッズ998244353 #define setIO(S)freopenは(S ".IN"、 "R"、標準入力) 名前空間stdを使用。 int型invg [N]、DP [N]、F [N]、FAC [N]、INV [N]。 LL G [N]。 INT qpow(int型のx、int型のY) { int型TMP = 1; (; Y、Y >> = 1、X =(LL)X * X%のMOD)用 もし(Y&1)TMP =(LL)TMP * X%のMOD。 tmpに返します。 } C君(Yもしあなたが、X) { リターン(LL)FAC [X] * INV [Y]%のMOD * INV [XY]%のMOD。 } INT INV(INT X){戻りqpow(X、MOD-2)。} ボイド(解決) { 整数N、M、L、MI、第k、I、J。 scanf関数( "%D%D%D%D"、&N、&M&L、&k番目)。 MI =分(分(n、m)は、L)。 IF(第k> MI){のprintf( "0 \ n"); リターン; } = 1LLにおけるLL TOT = 1LL * N * M%MOD * 1%のMOD、。 G [0] TOT = v%と; 以下のための式(I = 1; I <= MI; ++ I) { G [I] =(TOT-1LL *(N)*(ml)の%V *(L)%のV + V)%のV。 * G IN = IN [I]%のMOD。 } invg [M] = qpow(内MOD-2)。 invg [I] =(LL)invg [I + 1] * G [I + 1]%のMOD; - (I; I> = 0 iは、MI-1 =)のために F [0] = 1; F [I + 1] =(LL)F [i]は*(NI)%MOD *(MI)%MOD *(LI)%のMOD;(; I <MI ++ I I = 0)するため 以下のために(私は= 0; iが<= MI; ++ I)DP [I] =(LL)F [I] * invgを[I]%MOD。 INT年= 0; (I = k番目; I <= MI; ++ i)が用 { int型のD =((I-k番目)&1)(MOD-1):1;? (ANS + =(LL)、D * C(I、k番目)%MOD * DP [I]%のMOD)%= MOD。 } printf( "%dの\ n" は、ANS)。 } 空のinit() { I [0] = 1; 以下のために(INT iが= 1; I <N; I ++)FAC [i]は=(LL)FAC [I-1] * I%のMOD。 INV [N-1] = qpow(FAC [N-1]、MOD-2)。 INV [I] =(LL)INV [I + 1] *(I + 1)%のMOD(; I> = 0 i--をiがN-2 = INT)のために、 } メインint型() { // setIO( "入力"); 初期化(); I、J、Tをint型。 scanf関数( "%のD"、&T)。 一方、(T--)(解きます)。 0を返します。 }