HDU 6061 RXD and functions(NTT)
2017-08-06 16:52
435 查看
Description
![](http://img.blog.csdn.net/20170806163659319?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVjVaU1E=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Input
多组用例,每组用例首先输入一整数n表示f的次数,之后输入n+1个整数c[i]表示f的系数,然后输入一整数m,之后输入m个整数a[i],以文件尾结束输入
(n<=1e5,0<=a[i],c[i]<998244353,sum{m}<=1e5)
Output
对于每组用例,输出b[0]~b
Sample Input
2
0 0 1
1
1
Sample Output
1 998244351 1
Solution
![](http://img.blog.csdn.net/20170806165204948?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvVjVaU1E=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Code
Input
多组用例,每组用例首先输入一整数n表示f的次数,之后输入n+1个整数c[i]表示f的系数,然后输入一整数m,之后输入m个整数a[i],以文件尾结束输入
(n<=1e5,0<=a[i],c[i]<998244353,sum{m}<=1e5)
Output
对于每组用例,输出b[0]~b
Sample Input
2
0 0 1
1
1
Sample Output
1 998244351 1
Solution
Code
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxbit=18,maxlen=1<<maxbit,mod=998244353,g=3,maxn=100001; int wn[maxlen],inv2[maxbit+1],fact[maxn],inv[maxn]; int mod_pow(int a,int b) { int ans=1; while(b) { if(b&1)ans=(ll)ans*a%mod; a=(ll)a*a%mod; b>>=1; } return ans; } void init() { wn[0]=1,wn[1]=mod_pow(g,(mod-1)>>maxbit); for(int i=2;i<maxlen;i++)wn[i]=(ll)wn[i-1]*wn[1]%mod; inv2[0]=1,inv2[1]=(mod+1)/2; for(int i=2;i<=maxbit;i++)inv2[i]=(ll)inv2[i-1]*inv2[1]%mod;//预处理2^i的逆元 fact[0]=1; for(int i=1;i<maxn;i++)fact[i]=(ll)i*fact[i-1]%mod;//求i! inv[0]=inv[1]=1; for(int i=2;i<maxn;i++)inv[i]=mod-(int)(mod/i*(ll)inv[mod%i]%mod);//线性求1~n逆元 for(int i=1;i<maxn;i++)inv[i]=(ll)inv[i-1]*inv[i]%mod;//预处理i!的逆元 } void ntt(int *x,int len,int sta) { for(int i=0,j=0;i<len;i++) { if(i>j)swap(x[i],x[j]); for(int l=len>>1;(j^=l)<l;l>>=1); } for(int i=1,d=1;d<len;i++,d<<=1) for(int j=0;j<len;j+=d<<1) for(int k=0;k<d;k++) { int t=(ll)wn[(maxlen>>i)*k]*x[j+k+d]%mod; x[j+d+k]=x[j+k]-t<0?x[j+k]-t+mod:x[j+k]-t; x[j+k]=x[j+k]+t>=mod?x[j+k]+t-mod:x[j+k]+t; } if(sta==-1) { reverse(x+1,x+len); int bitlen=0; while((1<<bitlen)<len)bitlen++; int val=inv2[bitlen]; for(int i=0;i<len;i++)x[i]=(ll)x[i]*val%mod; } } void NTT(int *a,int *b,int len1,int len2) { int len=1; while(len<len1+len2)len<<=1; for(int i=len1;i<len;i++)a[i]=0; for(int i=len2;i<len;i++)b[i]=0; ntt(a,len,1),ntt(b,len,1); for(int i=0;i<len;i++)a[i]=(ll)a[i]*b[i]%mod; ntt(a,len,-1); } int n,m,c[maxn],a; int A[maxlen],B[maxlen]; int main() { init(); while(~scanf("%d",&n)) { for(int i=0;i<=n;i++)scanf("%d",&c[i]); scanf("%d",&m); a=0; for(int i=0;i<m;i++) { int t; scanf("%d",&t); a+=t; if(a>=mod)a-=mod; } int temp=1; A[0]=1; for(int i=1;i<=n;i++) { temp=(ll)temp*a%mod; temp=mod-temp; A[i]=(ll)temp*inv[i]%mod; } for(int i=0;i<=n;i++)B[i]=(ll)c[n-i]*fact[n-i]%mod; NTT(A,B,n+1,n+1); for(int i=0;i<=n;i++)A[i]=(ll)A[i]*inv[n-i]%mod; for(int i=0;i<=n;i++)printf("%d ",A[n-i]); printf("\n"); } }
相关文章推荐
- HDU 6061 RXD and functions(NTT+卷积)
- [HDU] 6061 RXD and functions [NTT]
- HDU 6061 RXD and functions NTT
- 解题报告:HDU_6061 RXD and functions NTT
- 2017 多小训练第三场 HDU 6061 RXD and functions
- 2017 多校3 hdu 6061 RXD and functions
- hdu 6061 RXD and functions [快速数论变换]
- HDU 6061 RXD and functions
- HDU 6061 RXD and functions
- 【推导】【NTT】hdu6061 RXD and functions(NTT)
- HDU-2017 多校训练赛3-1008-RXD and math
- 2017 Multi-University Training Contest 3( hdu 6060) RXD and dividing
- HDU 6064 RXD and numbers(BEST theorem)
- (2017多校训练第三场)HDU - 6063 RXD and math 找规律 + 快速幂
- HDU-2017 多校训练赛3-1005-RXD and dividing
- HDU-6060 RXD and dividing - 2017 Multi-University Training Contest - Team 3(思维+最小斯坦纳树)
- 多校3 HDU - 6063 RXD and math 数学
- HDU 6060 RXD and dividing【斯坦纳树】
- 17 多校 3 - 1008 - RXD and math(HDU 6063)
- HDU 6060 RXD and dividing