• 付公主的背包


    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    const int maxn = 1 << 19;
    const int mod = 998244353,g=3;
    typedef long long ll;
    inline int pw(int a,int b,int ans=1){
    	for(;b;b>>=1,a=ll(a)*a%mod)
    		if(b&1)ans=ll(ans)*a%mod;
    	return ans;
    }
    inline int inv(int x){return pw(x,mod-2);}
    int rev[maxn],wn[maxn],lim;
    inline void init(int len){
    	wn[0]=lim=1;
    	while(lim<len)lim<<=1;
    	for(int i=1;i<lim;++i)rev[i]=rev[i>>1]>>1|(i%2*lim/2);
    }
    inline int reduce(int x){return x+(x>>31&mod);}
    inline void fst(int*a,int type){
    	for(int i=1;i<lim;++i)if(rev[i]>i)std::swap(a[i],a[rev[i]]);
    	for(int mid=1;mid<lim;mid<<=1){
    		const int W=pw(3,mod/mid/2);
    		for(int k=1;k<mid;++k)wn[k]=ll(wn[k-1])*W%mod;
    		for(int j=0;j<lim;j+=mid+mid){
    			for(int*A=a+j,*B=A+mid,*w=wn;w!=wn+mid;++A,++B,++w){
    				const int x=*A,y=ll(*B)**w%mod;
    				*A=reduce(x+y-mod),*B=reduce(x-y);
    			}
    		}
    	}
    	if(!type){
    		for(int i=0,lm=inv(lim);i<lim;++i)a[i]=ll(lm)*a[i]%mod;
    		std::reverse(a+1,a+lim);
    	}
    }
    inline void cpy(int*a,const int*b,int len){
    	for(int i=0;i<len;++i)a[i]=b[i];
    	for(int i=len;i<lim;++i)a[i]=0;
    }
    inline void inv(const int*a,int*b,int len){
    	if(len==1)return void(*b=inv(*a));
    	inv(a,b,len+1>>1),init(len*3/2+1);
    	static int c[maxn],d[maxn];
    	cpy(c,a,len),cpy(d,b,len+1>>1);
    	fst(c,1),fst(d,1);
    	for(int i=0;i<lim;++i)c[i]=ll(c[i])*d[i]%mod*d[i]%mod;
    	fst(c,0);
    	for(int i=len+1>>1;i<len;++i)b[i]=reduce(-c[i]);
    }
    int inv_[maxn];
    inline void initinv(int n){inv_[1]=1;for(int i=2;i<=n;++i)inv_[i]=inv_[mod%i]*ll(mod-mod/i)%mod;}
    inline void DER(int*a,int len){for(int i=0;i+1<len;++i)a[i]=a[i+1]*ll(i+1)%mod;a[len-1]=0;}
    inline void INT(int*a,int len){for(int i=len;i;--i)a[i]=ll(a[i-1])*inv_[i]%mod;a[0]=0;}
    inline void Ln(const int*a,int*b,int len){
    	static int c[maxn];
    	std::copy(a,a+len,c),DER(c,len),inv(a,b,len);
    	init(len<<1);
    	for(int i=len;i<lim;++i)b[i]=c[i]=0;
    	fst(b,1),fst(c,1);
    	for(int i=0;i<lim;++i)b[i]=ll(b[i])*c[i]%mod;
    	fst(b,0),INT(b,len);
    }
    inline void exp(const int*a,int*b,int len){
    	if(len==1)return void(*b=1);
    	exp(a,b,len+1>>1);
    	static int c[maxn],d[maxn];
    	Ln(b,c,len),init(len);
    	for(int i=0;i<len;++i)c[i]=reduce(a[i]-c[i]);
    	for(int i=len;i<lim;++i)c[i]=0;++c[0];
    	cpy(d,b,len+1>>1);
    	fst(c,1),fst(d,1);
    	for(int i=0;i<lim;++i)c[i]=ll(c[i])*d[i]%mod;
    	fst(c,0);
    	for(int i=len+1>>1;i<len;++i)b[i]=c[i];
    }
    int a[maxn],b[maxn],c[maxn],n,m;
    int main(){
    	std::ios::sync_with_stdio(false),std::cin.tie(0);
    	std::cin >> n >> m,++m;
    	initinv(m);
    	for(int i=1,x;i<=n;++i)
    		std::cin >> x,++a[x];
    	for(int i=1;i<m;++i){
    		if(a[i]){
    			for(int j=i,k=1;j<m;j+=i,++k){
    				b[j] = (b[j] + ll(a[i]) * inv_[k])%mod;
    			}
    		}
    	}
    	exp(b,c,m);
    	for(int i=1;i<m;++i)
    		std::cout << c[i] << '
    ';
    }
    
    
  • 相关阅读:
    java源码--Map
    数据结构 -- 哈希表(hash table)
    第三篇:SpringBoot模板Freemaker使用
    第四篇:SpringBoot 数据持久化之JdbcTemplate
    数据结构 -- 红黑树
    第二篇:彻底搞清楚 Spring Boot 的配置文件 properties和yml
    数据结构 -- AVL树
    Spring Boot之从Spring Framework装配掌握SpringBoot自动装配
    数据结构 -- Trie字典树
    数据结构 -- 并查集
  • 原文地址:https://www.cnblogs.com/skip1978/p/11047238.html
Copyright © 2020-2023  润新知