T2 罔两
思路:
考场打表找规律……
能推出
d
p
dp
dp方程:
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]为共
i
i
i个数,选出
j
j
j个数的合法方案数。
1.当
i
,
j
i,j
i,j同奇偶时,
d
p
[
i
]
[
j
]
=
d
p
[
i
−
1
]
[
j
]
+
d
p
[
i
−
1
]
[
j
−
1
]
dp[i][j]=dp[i-1][j]+dp[i-1][j-1]
dp[i][j]=dp[i−1][j]+dp[i−1][j−1]。
2.反之,
d
p
[
i
]
[
j
]
=
d
p
[
i
−
1
]
[
j
]
dp[i][j]=dp[i-1][j]
dp[i][j]=dp[i−1][j]。
于是乎还是只能打表……
规律: a n s [ n ] [ m ] = C ( n + m ) / 2 m ans[n][m]=C^{m}_{(n+m)/2} ans[n][m]=C(n+m)/2m
预处理: m u l [ i ] ( i ! % m o d ) , i n v [ i ] , ( i − 1 % m o d ) , m u l i n v [ i ] ( i ! − 1 % m o d ) mul[i](i!\%mod),inv[i],(i^{-1}\%mod),mul_inv[i](i!^{-1}\%mod) mul[i](i!%mod),inv[i],(i−1%mod),mulinv[i](i!−1%mod)
代码:
#include<bits/stdc++.h>
using namespace std;
#define in Read()
#define LL long long
#define re register
inline int in{
int s=0,f=1;char x;
for(x=getchar();!isdigit(x);x=getchar()) if(x=='-') f=-1;
for( ;isdigit(x);x=getchar()) s=(s<<1)+(s<<3)+(x&15);
return s*f;
}
const int A=1e6;
const LL mod=998244353;
int t,n,m;
LL p;
LL a,b;
LL mul[A+5],inv[A+5],ans[A+5];
inline void prepare(){
mul[0]=mul[1]=1;
for(re int i=2;i<=A;i++)
mul[i]=mul[i-1]*i%mod;
inv[0]=inv[1]=1;
for(re int i=2;i<=A;i++)
inv[i]=((-1)*(mod/i)*inv[mod%i]%mod+mod)%mod;
ans[0]=ans[1]=1;
for(re int i=2;i<=A;i++)
ans[i]=ans[i-1]*inv[i]%mod;
return;
}
signed main(){
t=in;
prepare();
while(t--){
n=in,m=in;
p=(n+m)/2;
printf("%lld\n",((mul[p]*ans[m]%mod)*ans[p-m]%mod+mod)%mod);
}
return 0;
}