• luoguP4389 完全背包计数


    luoguP4389 完全背包计数

    题意就是完全背包计数,也就是求出(prodfrac{1}{1-x^{a_i}})

    这个东西肯定不能直接做,我们考虑ln

    [ln(frac{1}{1-x^v}) =-ln(1-x^v)\=-intfrac{(1-x^v)'}{1-x^v}\=-int -vx^{v-1}sum_{i=0} x^{iv} \=int sum_{i=1} vx^{iv-1}\=sum_{i=1} frac{1}{iv} vx^{iv}\=sum_{i=1} frac{1}{i} x^{iv} ]

    也可以直接泰勒展开,推的话要找n阶导的规律,直接背特殊的就行了。

    [ln(1+x)=sum_{i=1} -1^{i+1}frac{x^i} i ]

    最后归归类加起来最后exp就行了,复杂度是一个log

    #include<bits/stdc++.h>
    using namespace std;
    int read(){
    	int x=0,pos=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') pos=0;
    	for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';return pos?x:-x;
    }
    #define FOR(i,a,b) for(int i=a;i<=b;++i)
    const int N = 400201;
    #define ROF(i,a,b) for(int i=a;i>=b;--i)
    int n;
    const int mod = 998244353;
    const int LSZ=21,SZ=1<<LSZ;
    int ksm(int a,int b){
    	int res=1;
    	while(b){
    		if(b&1) res=1ll*res*a%mod;
    		a=1ll*a*a%mod,b>>=1;
    	}return res;
    }
    int tr[SZ],omg[SZ][2];
    void init(int n){
    	int lim=0;while((1<<lim)<n) lim++;
    	FOR(i,0,n-1) tr[i]=tr[i>>1]>>1|((i&1)<<(lim-1));
    	omg[0][0]=omg[0][1]=1;
    	omg[1][0]=ksm(3,(mod-1)/n);
    	omg[1][1]=ksm(omg[1][0],mod-2);
    	FOR(i,2,n) omg[i][0]=1ll*omg[i-1][0]*omg[1][0]%mod,omg[i][1]=1ll*omg[i-1][1]*omg[1][1]%mod;
    }
    void dft(int *f,int n,int opt){
    	//assert((int)f.size()<=n);
    	for(int i=0;i<n;++i) if(i<tr[i]) swap(f[i],f[tr[i]]);
    	for(int l=2;l<=n;l<<=1){ int m=l/2;
    		for(int *g=f;g!=f+n;g+=l){
    			for(int i=0;i<m;i++){
    				int t=1ll*omg[n/l*i][opt]*(g[i+m])%mod;
    				g[i+m]=(g[i]-t+mod)%mod;g[i]=(g[i]+t)%mod;
    			}
    		}
    	}
    	if(opt) for(int i=0,iv=ksm(n,mod-2);i<n;i++) f[i]=1ll*f[i]*iv%mod;
    }
    void dao(int *a,int n){
    	FOR(i,1,n-1) a[i-1]=1ll*a[i]*i%mod;a[n-1]=0;
    }
    void jifen(int *a,int n){
    	ROF(i,n,1)a[i]=1ll*a[i-1]*ksm(i,mod-2)%mod;a[0]=0;
    }
    int MA[N],MB[N];
    void mul(const int *a,const int *b,int *ans,int n){
    	FOR(i,0,n-1) MA[i]=a[i],MB[i]=b[i];
    	int len=1;while(len<n) len*=2;init(len);
    	dft(MA,len,0),dft(MB,len,0);
    	FOR(i,0,len-1) ans[i]=1ll*MA[i]*MB[i]%mod;
    	dft(ans,len,1);
    	FOR(i,0,len-1) MA[i]=MB[i]=0;
    } 
    int FV[N];
    inline void getinv(const int *a,int *b,int n){
    	if(n==1) return b[0]=ksm(a[0],mod-2),void();
    	getinv(a,b,(n+1)/2);
    	int len=1;while(len<n*2) len*=2;init(len);
    	FOR(i,0,n-1) FV[i]=a[i];FOR(i,n,len-1) FV[i]=0;
    	dft(FV,len,0);dft(b,len,0);
    	FOR(i,0,len-1) b[i]=(2ll-1ll*FV[i]*b[i]%mod+mod)%mod*b[i]%mod;
    	dft(b,len,1);FOR(i,n,len) b[i]=0;
    }
    int DLN[N];
    void out(int *ans){
    	FOR(i,0,n) printf("%d ",ans[i]);putchar(10); 
    }
    inline void getln(const int *a,int *ans,int n){
    	getinv(a,ans,n);
    	FOR(i,0,n-1) DLN[i]=a[i];dao(DLN,n);
    	mul(ans,DLN,ans,2*n);
    	jifen(ans,n);ans[n]=0;
    }
    int ET[N];
    inline void getexp(const int *a,int *ans,int n){
    	if(n==1) return ans[0]=1,void();
    	getexp(a,ans,(n+1)/2);
    	FOR(i,0,n-1) ET[i]=0;getln(ans,ET,n);
    	ET[0]=(1ll+a[0]-ET[0]+mod)%mod;
    	FOR(i,1,n-1) ET[i]=(0ll+a[i]-ET[i]+mod)%mod;
    	mul(ans,ET,ans,n*2);FOR(i,n,n*2-1) ans[i]=0;
    } 
    int ST[N];
    inline void getsqrt(const int *a,int *ans,int n){
    	if(n==1) return ans[0]=1,void();
    	getsqrt(a,ans,(n+1)/2);
    	FOR(i,0,n-1) ST[i]=0;getinv(ans,ST,n);
    	mul(ST,a,ST,n*2);int i2=ksm(2,mod-2);
    	FOR(i,0,n-1) ans[i]=(1ll*i2*((ans[i]+ST[i])%mod))%mod;
    }
    int a[N],ans[N],v[N];
    int f[N],g[N],inv[N],m;
    void init1(){
    	f[0]=1;FOR(i,1,N-1) f[i]=1ll*f[i-1]*i%mod;
    	g[N-1]=ksm(f[N-1],mod-2);ROF(i,N-2,0) g[i]=1ll*g[i+1]*(i+1)%mod;
    	FOR(i,1,N-1) inv[i]=1ll*g[i]*f[i-1]%mod;
    }
    int main(){
    	n=read();m=read();m++;
    	init1();
    	for(int _=0;_<n;_++){
    		int x=read();v[x]++;
    	}
    	FOR(x,1,m){
    		if(!v[x]) continue;
    		for(int i=1;i*x<m;i++){
    			a[i*x]=(a[i*x]+1ll*inv[i]*v[x]%mod)%mod;
    		} 
    	}
    	getexp(a,ans,m);
    	FOR(i,1,m-1){
    		printf("%d
    ",ans[i]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    移动端事件
    移动端的三种布局
    bootstrap自定义——栅格列数修改
    less文件的运行
    lessc的安装
    nodejs的安装
    jquery插件之jquery-ui
    指定网卡进行ping操作
    汇编语言从入门到精通-4标识符和表达式
    汇编语言从入门到精通-3操作数的寻址方式
  • 原文地址:https://www.cnblogs.com/lcyfrog/p/14292592.html
Copyright © 2020-2023  润新知