JZOJ6757.【NOI2020模拟07.22】T3(singer)

Description

在这里插入图片描述

  • n < 2 19 , m ( n − k + 1 ) < 2 20 n<2^{19},m(n-k+1)<2^{20} n<219,m(nk+1)<220,模 998244353 998244353 998244353

Solution

  • 首先容斥,恰好 k k k个容斥成至少 k k k个升调,那么对于长度 n n n来说至多有 n − k n-k nk段。
  • 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)nig(i)
  • f ( x ) = ( x + 1 ) m − 1 f(x)=(x+1)^m-1 f(x)=(x+1)m1
  • 枚举 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=kNi=knCik(1)ikfni(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)ikn=iNfni(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)ikn=iNfni(x)xNn
  • 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)ikfxfNi+1xNi+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)ikxfxfNi+1xNi+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)ikfNi+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)ikj=0Ni+1(x+1)mj(1)Ni+1jCNi+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=kNj=0Ni+1(x+1)mj(1)Ni+1j+ikCNi+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=0Nk+1(x+1)mj(1)N+1+j+ki=kNj+1CNi+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=0Nk+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=0Nk+1i=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(Nk+1)j=i/mNk+1i!(mji)!(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} fx1

  • 注意乘法的时候要开两倍。

  • 多项式求逆的时候有值得下标不能超过 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)ikn=iNfni(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)ikn=iNfni(x)xNn
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#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(){
    
    
//	freopen("singer.in","r",stdin);
//	freopen("singer.out","w",stdout);
	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);
}


猜你喜欢

转载自blog.csdn.net/qq_43649416/article/details/107503881