zoukankan      html  css  js  c++  java
  • P6800-[模板]Chirp Z-Transform【NTT】

    正题

    题目链接:https://www.luogu.com.cn/problem/P6800


    题目大意

    给出一个(n)此多项式(P),对于(kin[0,m-1])所有的求(P(c^k))
    输出答案对(998244353)取模
    (1leq n,mleq 10^6)


    解题思路

    [g(n)=sum_{i=0}^{n-1}a_ic^{i imes n} ]

    然后根据(i imes n=inom{i+n}{2}-inom{i}{2}-inom{n}{2})

    [g(n)=c^{-inom{n}{2}}sum_{i=0}^{n-1}a_ic^{inom{i+n}{2}}c^{-inom{i}{2}} ]

    然后这是一个反着卷积的形式,直接上NTT就好了

    时间复杂度(O(nlog n))


    code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    const ll N=4e6+10,P=998244353;
    ll n,m,c,a[N],r[N],F[N],G[N];
    ll power(ll x,ll b){
    	ll ans=1;b%=P-1;
    	while(b){
    		if(b&1)ans=ans*x%P;
    		x=x*x%P;b>>=1;
    	}
    	return ans;
    }
    ll C(ll n)
    {return n*(n-1)/2;}
    void NTT(ll *f,ll n,ll op){
    	for(ll i=0;i<n;i++)
    		if(i<r[i])swap(f[i],f[r[i]]);
    	for(ll p=2;p<=n;p<<=1){
    		ll tmp=power(3,(P+1)/p),len=p>>1;
    		if(op==-1)tmp=power(tmp,P-2);
    		for(ll k=0;k<n;k+=p){
    			ll buf=1;
    			for(ll i=k;i<k+len;i++){
    				ll tt=f[i+len]*buf%P;
    				f[i+len]=(f[i]-tt+P)%P;
    				f[i]=(f[i]+tt)%P;
    				buf=buf*tmp%P;
    			}
    		}
    	}
    	if(op==-1){
    		ll invn=power(n,P-2);
    		for(ll i=0;i<n;i++)
    			f[i]=f[i]*invn%P;
    	}
    	return;
    }
    signed main()
    {
    	scanf("%lld%lld%lld",&n,&c,&m);
    	ll inv=power(c,P-2);
    	for(ll i=0;i<n;i++)
    		scanf("%lld",&a[i]);
    	for(ll i=0;i<n+m;i++)
    		F[i]=power(c,C(n+m-i-1));
    	for(ll i=0;i<n;i++)
    		G[i]=a[i]*power(inv,C(i))%P;
    	ll len=1;
    	while(len<n+m)len<<=1;
    	for(ll i=0;i<len;i++)
    		r[i]=(r[i>>1]>>1)|((i&1)?(len>>1):0);
    	NTT(F,len,1);NTT(G,len,1);
    	for(ll i=0;i<len;i++)F[i]=F[i]*G[i]%P;
    	NTT(F,len,-1);
    	for(ll i=n+m-1;i>=n;i--)
    		printf("%lld ",F[i]*power(inv,C(n+m-i-1))%P);
    	return 0;
    }
    
  • 相关阅读:
    浙大PAT CCCC L3-001 凑零钱 ( 0/1背包 && 路径记录 )
    二分图匹配
    Codeforces 939E Maximize ( 三分 || 二分 )
    冲刺第二周第七天
    冲刺第二周第六天
    冲刺第二周第五天
    构建之法阅读笔记04
    冲刺第二周第四天
    构建之法阅读笔记03
    构建之法阅读笔记02
  • 原文地址:https://www.cnblogs.com/QuantAsk/p/15034903.html
Copyright © 2011-2022 走看看