Description

- n < 2 19 , m ( n − k + 1 ) < 2 20 n<2^{19},m(n-k+1)<2^{20} n<219,m(n−k+1)<220,模 998244353 998244353 998244353
Solution
- 首先容斥,恰好 k k k个容斥成至少 k k k个升调,那么对于长度 n n n来说至多有 n − k n-k n−k段。
- f ( n ) = ∑ i > = n C i n ( − 1 ) n − i g ( i ) f(n)=\sum_{i>=n}C_i^n(-1)^{n-i}g(i) f(n)=∑i>=nCin(−1)n−ig(i)
- 设 f ( x ) = ( x + 1 ) m − 1 f(x)=(x+1)^m-1 f(x)=(x+1)m−1
- 枚举 i i i段组合在了一起,长度为 n n n,枚举有 i > = k i>=k i>=k个升调。
- A n s = ∑ n = k N ∑ i = k n C i k ( − 1 ) i − k f n − i ( x ) [ x n ] Ans=\sum_{n=k}^N\sum_{i=k}^nC_i^k(-1)^{i-k}f^{n-i}(x)[x^n] Ans=∑n=kN∑i=knCik(−1)i−kfn−i(x)[xn]
- A n s = ∑ i = k N C i k ( − 1 ) i − k ∑ n = i N f n − i ( x ) [ x n ] Ans=\sum_{i=k}^NC_i^k(-1)^{i-k}\sum_{n=i}^Nf^{n-i}(x)[x^n] Ans=∑i=kNCik(−1)i−k∑n=iNfn−i(x)[xn]
- A n s = [ x N ] ∑ i = k N C i k ( − 1 ) i − k ∑ n = i N f n − i ( x ) x N − n Ans=[x^N]\sum_{i=k}^NC_i^k(-1)^{i-k}\sum_{n=i}^Nf^{n-i}(x)x^{N-n} Ans=[xN]∑i=kNCik(−1)i−k∑n=iNfn−i(x)xN−n
- A n s = [ x N ] ∑ i = k N C i k ( − 1 ) i − k f N − i + 1 − x N − i + 1 f − x Ans=[x^N]\sum_{i=k}^NC_i^k(-1)^{i-k}\frac{f^{N-i+1}-x^{N-i+1}}{f-x} Ans=[xN]∑i=kNCik(−1)i−kf−xfN−i+1−xN−i+1
- A n s = [ x N + 1 ] ∑ i = k N C i k ( − 1 ) i − k f N − i + 1 − x N − i + 1 f − x x Ans=[x^{N+1}]\sum_{i=k}^NC_i^k(-1)^{i-k}\frac{f^{N-i+1}-x^{N-i+1}}{{\frac{f-x}{x}}} Ans=[xN+1]∑i=kNCik(−1)i−kxf−xfN−i+1−xN−i+1
- 相当于求:
- F ( x ) = ∑ i = k N C i k ( − 1 ) i − k f N − i + 1 F(x)=\sum_{i=k}^NC_i^k(-1)^{i-k}f^{N-i+1} F(x)=∑i=kNCik(−1)i−kfN−i+1
- F ( x ) = ∑ i = k N C i k ( − 1 ) i − k ∑ j = 0 N − i + 1 ( x + 1 ) m j ( − 1 ) N − i + 1 − j C N − i + 1 j F(x)=\sum_{i=k}^NC_i^k(-1)^{i-k}\sum_{j=0}^{N-i+1}(x+1)^{mj}(-1)^{N-i+1-j}C_{N-i+1}^j F(x)=∑i=kNCik(−1)i−k∑j=0N−i+1(x+1)mj(−1)N−i+1−jCN−i+1j
- F ( x ) = ∑ i = k N ∑ j = 0 N − i + 1 ( x + 1 ) m j ( − 1 ) N − i + 1 − j + i − k C N − i + 1 j C i k F(x)=\sum_{i=k}^N\sum_{j=0}^{N-i+1}(x+1)^{mj}(-1)^{N-i+1-j+i-k}C_{N-i+1}^jC_i^k F(x)=∑i=kN∑j=0N−i+1(x+1)mj(−1)N−i+1−j+i−kCN−i+1jCik
- F ( x ) = ∑ j = 0 N − k + 1 ( x + 1 ) m j ( − 1 ) N + 1 + j + k ∑ i = k N − j + 1 C N − i + 1 j C i k F(x)=\sum_{j=0}^{N-k+1}(x+1)^{mj}(-1)^{N+1+j+k}\sum_{i=k}^{N-j+1}C_{N-i+1}^jC_i^k F(x)=∑j=0N−k+1(x+1)mj(−1)N+1+j+k∑i=kN−j+1CN−i+1jCik
- F ( x ) = ∑ j = 0 N − k + 1 ( x + 1 ) m j ( − 1 ) N + 1 + j + k C N + 2 j + k + 1 F(x)=\sum_{j=0}^{N-k+1}(x+1)^{mj}(-1)^{N+1+j+k}C_{N+2}^{j+k+1} F(x)=∑j=0N−k+1(x+1)mj(−1)N+1+j+kCN+2j+k+1
- F ( x ) = ∑ j = 0 N − k + 1 ∑ i = 0 m j C m j i ( − 1 ) N + 1 + j + k C N + 2 j + k + 1 x i F(x)=\sum_{j=0}^{N-k+1}\sum_{i=0}^{mj}C_{mj}^i(-1)^{N+1+j+k}C_{N+2}^{j+k+1}x^i F(x)=∑j=0N−k+1∑i=0mjCmji(−1)N+1+j+kCN+2j+k+1xi
- F ( x ) = ∑ i = 0 m ( N − k + 1 ) ∑ j = i / m N − k + 1 ( m j ) ! i ! ( m j − i ) ! ( − 1 ) N + 1 + j + k C N + 2 j + k + 1 x i F(x)=\sum_{i=0}^{m(N-k+1)}\sum_{j=i/m}^{N-k+1}\frac{(mj)!}{i!(mj-i)!}(-1)^{N+1+j+k}C_{N+2}^{j+k+1}x^i F(x)=∑i=0m(N−k+1)∑j=i/mN−k+1i!(mj−i)!(mj)!(−1)N+1+j+kCN+2j+k+1xi
- 由于题目保证 m > = 2 m>=2 m>=2,再特判一下 k = 0 k=0 k=0即可。
注意事项
-
F ( x ) F(x) F(x)没有常数项!我也不知道为什么卷积之后突然出现了常数项,可能是我没有判掉吧。
-
多项式求逆的时候如果分母常数项为0,就上下同时除以一个 x x x
-
由于只需要求 x N x^{N} xN的值,所以只需要求出 m o d x N + 1 mod\ x^{N+1} mod xN+1后的 F ( x ) F(x) F(x)和 1 f − x \frac{1}{f-x} f−x1。
-
注意乘法的时候要开两倍。
-
多项式求逆的时候有值得下标不能超过 l i m / 2 lim/2 lim/2。
姿势
- 可以通过次数的移动使得求得东西变得简单,再用等比数列求解
- A n s = ∑ i = k N C i k ( − 1 ) i − k ∑ n = i N f n − i ( x ) [ x n ] Ans=\sum_{i=k}^NC_i^k(-1)^{i-k}\sum_{n=i}^Nf^{n-i}(x)[x^n] Ans=∑i=kNCik(−1)i−k∑n=iNfn−i(x)[xn]
- A n s = [ x N ] ∑ i = k N C i k ( − 1 ) i − k ∑ n = i N f n − i ( x ) x N − n Ans=[x^N]\sum_{i=k}^NC_i^k(-1)^{i-k}\sum_{n=i}^Nf^{n-i}(x)x^{N-n} Ans=[xN]∑i=kNCik(−1)i−k∑n=iNfn−i(x)xN−n
#include
#include
#include
#include
#define ll long long
#define mo 998244353
#define maxn 2097152
#define I(x) (((x)&1)?-1:1)
using namespace std;
int N,m,K,i,j,k;
int lim,bt[maxn];
ll fct[maxn],invf[maxn],w[maxn+1];
ll ksm(ll x,ll y){
ll s=1;
for(;y;y/=2,x=x*x%mo) if (y&1)
s=s*x%mo;
return s;
}
ll C(int n,int m){return fct[n]*invf[m]%mo*invf[n-m]%mo;}
void prepare(){
fct[0]=1;for(i=1;i<maxn;i++) fct[i]=fct[i-1]*i%mo;
invf[maxn-1]=ksm(fct[maxn-1],mo-2);
for(i=maxn-2;i>=0;i--) invf[i]=invf[i+1]*(i+1)%mo;
w[0]=1,w[1]=ksm(3,(mo-1)/maxn);
for(int i=2;i<=maxn;i++) w[i]=w[i-1]*w[1]%mo;
}
void dft(ll *a,int sig){
for(int i=1;i<lim;i++) if (i<bt[i]) swap(a[i],a[bt[i]]);
for(int mid=1;mid<lim;mid<<=1){
int st=(sig>0)?0:maxn,d=sig*maxn/(mid*2);
for(int j=0;j<lim;j+=mid<<1){
for(int k=0,p=st;k<mid;k++,p+=d){
ll x=a[j+k],y=a[j+k+mid]*w[p];
a[j+k]=(x+y)%mo,a[j+k+mid]=(x-y)%mo;
}
}
}
if (sig<0){
ll inv=ksm(lim,mo-2);
for(int i=0;i<lim;i++) a[i]=a[i]*inv%mo;
}
}
ll A[maxn],B[maxn],F[maxn],G[maxn];
void getlim(int n){
for(lim=1;lim<=n;lim<<=1);
for(int i=1;i<lim;i++) bt[i]=(bt[i>>1]>>1)|((i&1)*(lim>>1));
}
ll f[maxn];
void getfn(){
int M=m*(N-K+1);
getlim(M*2);
for(i=0;i<=N-K+1;i++)
A[m*i]=fct[m*i]*I(N+1+i+K)*C(N+2,i+K+1)%mo;
for(i=0;i<=M;i++) B[M-i]=invf[i];
dft(A,1),dft(B,1);
for(i=0;i<lim;i++) A[i]=A[i]*B[i]%mo;
dft(A,-1);
for(i=0;i<=M;i++) F[i]=(A[M+i]*invf[i]%mo+mo)%mo;
for(i=K;i<=N;i++) F[N-i+1]-=C(i,K)*I(i-K);
for(i=0;i<=M;i++) f[i]=(F[i+1]+mo)%mo;
memset(F,0,sizeof(F));
for(i=0;i<=N;i++) F[i]=f[i];
}
ll H[maxn];
void getg(){
for(i=0;i<m;i++) G[i]=C(m,i+1); G[0]--;
for(i=N+1;i<m;i++) G[i]=0;
int L=1; while (L<N+1) L<<=1;
H[0]=ksm(G[0],mo-2);
for(int k=2;k<=L;k<<=1){
getlim(k<<1);
for(i=0;i<k;i++) A[i]=G[i];
for(i=0;i<k;i++) B[i]=H[i];
for(i=k;i<lim;i++) B[i]=A[i]=0;
dft(A,1),dft(B,1);
for(i=0;i<lim;i++) A[i]=A[i]*B[i]%mo*B[i]%mo;
dft(A,-1);
for(i=0;i<k;i++) H[i]=(2*H[i]-A[i])%mo;
}
memset(G,0,sizeof(G));
for(i=0;i<=N;i++) G[i]=H[i];
}
int main(){
prepare();
scanf("%d%d%d",&N,&m,&K);
getfn();
getg();
getlim(2*N);
dft(F,1),dft(G,1);
for(i=0;i<lim;i++) F[i]=F[i]*G[i]%mo;
dft(F,-1);
printf("%lld\n",(F[N]+mo-(K==0))%mo);
}